คำตอบที่ชัดเจนคือการใช้Charset.defaultCharset()
แต่เมื่อเร็ว ๆ นี้เราพบว่านี่อาจไม่ใช่คำตอบที่ถูกต้อง ฉันได้รับแจ้งว่าผลลัพธ์แตกต่างจากชุดอักขระเริ่มต้นจริงที่ใช้โดยคลาส java.io ในหลาย ๆ ครั้ง ดูเหมือนว่า Java จะเก็บชุดอักขระเริ่มต้นไว้ 2 ชุด ใครมีข้อมูลเชิงลึกเกี่ยวกับปัญหานี้หรือไม่?
เราสามารถทำซ้ำกรณีล้มเหลวหนึ่งกรณี เป็นข้อผิดพลาดของผู้ใช้ แต่ยังอาจเปิดเผยสาเหตุของปัญหาอื่น ๆ ทั้งหมด นี่คือรหัส
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;
}
}
เซิร์ฟเวอร์ของเราต้องการชุดอักขระเริ่มต้นในภาษาละติน -1 เพื่อจัดการกับการเข้ารหัสแบบผสม (ANSI / Latin-1 / UTF-8) ในโปรโตคอลเดิม ดังนั้นเซิร์ฟเวอร์ทั้งหมดของเราจึงทำงานด้วยพารามิเตอร์ 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
นี่คือบั๊กหรือฟีเจอร์?
แก้ไข: คำตอบที่ยอมรับจะแสดงสาเหตุที่แท้จริงของปัญหา โดยทั่วไปคุณไม่สามารถเชื่อถือ defaultCharset () ใน Java 5 ซึ่งไม่ใช่การเข้ารหัสเริ่มต้นที่ใช้โดยคลาส I / O ดูเหมือนว่า Java 6 จะแก้ไขปัญหานี้