Açık cevap kullanmaktır, Charset.defaultCharset()
ancak yakın zamanda bunun doğru cevap olmayabileceğini öğrendik. Bana sonucun java.io sınıfları tarafından birkaç durumda kullanılan gerçek varsayılan karakter setinden farklı olduğu söylendi. Görünüşe göre Java, 2 set varsayılan karakter kümesini tutuyor. Bu konuyla ilgili herhangi bir fikri olan var mı?
Bir başarısızlık durumunu yeniden oluşturabildik. Bu bir tür kullanıcı hatasıdır, ancak yine de diğer tüm sorunların temel nedenini ortaya çıkarabilir. İşte kod,
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;
}
}
Sunucumuz, eski bir protokoldeki bazı karma kodlamalarla (ANSI / Latin-1 / UTF-8) ilgilenmek için Latin-1'de varsayılan karakter kümesini gerektirir. Dolayısıyla tüm sunucularımız bu JVM parametresiyle çalışır,
-Dfile.encoding=ISO-8859-1
İşte Java 5'teki sonuç,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Birisi kodda file.encoding ayarını yaparak kodlama çalışma zamanını değiştirmeye çalışır. Hepimiz bunun işe yaramadığını biliyoruz. Ancak, bu görünüşe göre defaultCharset () 'i atar, ancak OutputStreamWriter tarafından kullanılan gerçek varsayılan karakter kümesini etkilemez.
Bu bir hata mı yoksa özellik mi?
DÜZENLEME: Kabul edilen yanıt, sorunun temel nedenini gösterir. Temel olarak, G / Ç sınıfları tarafından kullanılan varsayılan kodlama olmayan Java 5'te defaultCharset () 'e güvenemezsiniz. Görünüşe göre Java 6 bu sorunu düzeltir.