明白な答えは使用することですCharset.defaultCharset()
が、最近これが正しい答えではない可能性があることがわかりました。結果は、いくつかの場面でjava.ioクラスが使用する実際のデフォルトの文字セットとは異なると言われました。Javaは2セットのデフォルト文字セットを保持しているようです。誰かがこの問題について何か洞察を持っていますか?
フェイルケースを1つ再現することができました。これは一種のユーザーエラーですが、他のすべての問題の根本的な原因が明らかになる可能性があります。これがコードです
public class CharSetTest {
public static void main(String[] args) {
System.out.println("Default Charset=" + Charset.defaultCharset());
System.setProperty("file.encoding", "Latin-1");
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("Default Charset in Use=" + getDefaultCharSet());
}
private static String getDefaultCharSet() {
OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
String enc = writer.getEncoding();
return enc;
}
}
私たちのサーバーは、レガシープロトコルでいくつかの混合エンコーディング(ANSI / Latin-1 / UTF-8)を処理するために、Latin-1のデフォルトの文字セットを必要とします。したがって、すべてのサーバーはこのJVMパラメータで実行され、
-Dfile.encoding=ISO-8859-1
これがJava 5の結果です
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
誰かがコードでfile.encodingを設定することにより、エンコーディングランタイムを変更しようとします。私たちは皆、それがうまくいかないことを知っています。ただし、これは明らかにdefaultCharset()をスローしますが、OutputStreamWriterが使用する実際のデフォルトの文字セットには影響しません。
これはバグですか、機能ですか?
編集:受け入れられた回答は、問題の根本的な原因を示しています。基本的に、Java 5のdefaultCharset()は信頼できません。これは、I / Oクラスで使用されるデフォルトのエンコーディングではありません。Java 6がこの問題を修正したようです。