Jawaban yang jelas adalah dengan menggunakan Charset.defaultCharset()
tetapi kami baru-baru ini menemukan bahwa ini mungkin bukan jawaban yang tepat. Saya diberitahu bahwa hasilnya berbeda dari charset default nyata yang digunakan oleh kelas java.io dalam beberapa kesempatan. Sepertinya Java menyimpan 2 set rangkaian karakter default. Apakah ada yang punya wawasan tentang masalah ini?
Kami dapat mereproduksi satu kasus gagal. Ini semacam kesalahan pengguna tetapi mungkin masih mengekspos akar penyebab semua masalah lainnya. Ini kodenya,
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;
}
}
Server kami memerlukan charset default dalam Latin-1 untuk menangani beberapa encoding campuran (ANSI / Latin-1 / UTF-8) dalam protokol lama. Jadi semua server kami berjalan dengan parameter JVM ini,
-Dfile.encoding=ISO-8859-1
Inilah hasilnya di Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Seseorang mencoba mengubah runtime pengkodean dengan mengatur file.encoding dalam kode. Kita semua tahu itu tidak berhasil. Namun, ini tampaknya membuang defaultCharset () tetapi tidak mempengaruhi charset default nyata yang digunakan oleh OutputStreamWriter.
Apakah ini bug atau fitur?
EDIT: Jawaban yang diterima menunjukkan akar penyebab masalah. Pada dasarnya, Anda tidak dapat mempercayai defaultCharset () di Java 5, yang bukan merupakan pengkodean default yang digunakan oleh kelas I / O. Sepertinya Java 6 memperbaiki masalah ini.