Java のデフォルト文字セットの難問
Java では、プラットフォームで使用されるデフォルトの文字セットを取得する際に矛盾があるようです。この不一致は、2 つの異なるシステム プロパティ セットの使用と Java バージョン間の不一致が原因で発生します。
システム プロパティ
Java は、システムに基づいて 2 つのデフォルトの文字セットを維持します。 property:
Java バージョンの不一致
Java 5 では、Charset.defaultCharset()メソッドは、システム プロパティ file.encoding に基づいてキャッシュされた文字セットを返します。これは実行時にオーバーライドできます。ただし、I/O クラスで使用されるデフォルトの文字セットは影響を受けません。
対照的に、Java 6 では、Charset.defaultCharset() がエンコーディングを正しく反映するデフォルトの文字セットのキャッシュされた値を使用する変更が導入されました。 I/O クラスによって使用されます。
Java 5 での結果
質問で提供されているコード例に基づいて、Java 5 では次の結果が観察されます。
Default Charset=ISO-8859-1 file.encoding=Latin-1 Default Charset=UTF-8 Default Charset in Use=ISO8859_1
ここで、Charset.defaultCharset() はキャッシュされた値のため、最初は「ISO-8859-1」を返します。 file.encoding を「Latin-1」に設定しても、このキャッシュされた値は更新されません。その結果、Charset.defaultCharset() は引き続き「UTF-8」を返しますが、OutputStreamWriter は引き続き「ISO8859_1」をデフォルトのエンコーディングとして使用します。
バグまたは機能?
この不一致は、Java 5 のバグまたは意図的な設計上の選択と考えられます。 Java 6 以降のバージョンでは、デフォルトの文字セットを正しく同期およびキャッシュすることで問題が解決され、Charset.defaultCharset() とI/O クラス。
推奨事項
Java 5 には矛盾がありますが、実装に依存するため、Charset.defaultCharset() に依存しないことを強くお勧めします。自然。代わりに、テキスト データを操作する場合は、明示的な文字セット宣言を使用してください。
以上がJava 5 とそれ以降のバージョンのデフォルトの文字セット処理の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。