8

私のアプリケーションのi18n互換性をテストしています。 英語版のWindows 7があります。これは、システムの表示言語が英語であることを意味します。そして私は、非Unicodeアプリケーション用の中国語としてシステムロケールを設定しました。Charset.defaultCharset()はJDK1.7とJDK 1.6で異なる結果を得ます

jdk1.6でHtmlファイルをエクスポートすると問題が発生しましたが、jdk1.7で動作していてもうまく動作します。

私はそれをデバッグし、直接の理由はCharset.defaultCharset()が異なる値を返したということでした。

jdk1.7未満Charset.defaultCharset()GBK中国語の文字セットです。

jdk1.6未満Charset.defaultCharset()window_1252はラテン語の文字セットです。

私は、コード内で指定された文字セット、たとえばutf-8によって解決できる問題があることを知っています。

しかし、Charset.defaultCharset()がJDK1.7とJDK 1.6では異なる値を返す理由を知りたいと思います。

+1

「Unicodeではないアプリケーション用のロケール」の設定は、WindowsのJRE 7の新機能です。リリースノートで言及するほど重要ではないかもしれないと推測しています。バグデータベースの検索機能は実際にバグデータベースを検索しません)。 – millimoose

+3

[Unicodeと国際化の機能拡張](http://download.oracle.com/javase/7/docs/technotes/guides/intl /enhancements.7.html)をJava 7にインストールしました。おそらくこれはバンドルされていました。 – Bringer128

+1

jdk 6と7の両方で 'System.getProperty(" file.encoding ")'を呼び出すことで、何を得ることができますか? – mindas

答えて

3

Charset.defaultCharset()は、実行中のJVMの文字セットを提供するため、必ずしも同じ値であるとは限りません。たとえば、Netbeansでプログラムを実行している場合、NetbeansのJavaプロジェクトのデフォルトエンコーディングであるため、常にUTF-8が返されます。

私はあなたの設定に似ています。私のWindowsは英語です(メニュー、ダイアログは英語です)。私は非Unicodeアプリケーションのためにトルコ語を使用しています。フラグまたはシステムパラメータなしでJVMを起動すると、Charset.defaultCharset()が呼び出されたときにJava 7とJava 6の両方のランタイムが "CP1254"を返します。 System.getProperty("file.encoding")とデフォルトのIOエンコードも同じです。

あなたの問題は、JVMをどのように起動するか、あるいはJVMがデフォルトのエンコーディングを決める方法のどちらかであると思います。問題が以前のものではないことが分かっている場合(エンコーディングパラメータなしでJVMを実行し、プログラムのどこかでデフォルトの文字セットを変更しようとしない場合)、JVMはデフォルトのエンコーディングを誤ってフェッチします。

3

Java 7 technoteは言う:

Javaプラットフォーム、Standard Editionの7(ジャワSE 7)の異なる実装の間で変化サポートエンコーディングは。

Charset doc

は言う:Java仮想マシンの

すべてのインスタンスは、標準文字セットの一つであってもなくてもよいデフォルトの文字セット、 を持っています。デフォルトの 文字セットは仮想マシンの起動時に決定され、通常は は、基礎となる オペレーティングシステムで使用されているロケールと文字セットによって異なります。

また、私は、この最終的な評価で-Dfile.encodingを使用する方法について"bug"を見つけた:

これはバグではありません。 "file.encoding"プロパティは、 J2SEプラットフォーム仕様では必要ありません。これはSunの 実装の内部詳細であり、ユーザーコードで検証または変更しないでください。 これは読み取り専用にもなっています。 コマンドラインの任意の値にこのプロパティの設定をサポートすることは技術的に不可能です。

VMおよび で使用されるデフォルトのエンコーディングを変更するには、Javaプログラムを起動する前に、基盤となるプラットフォームのロケールを変更するのが好ましい方法です( )。

関連する問題