Câu trả lời rõ ràng là sử dụng Charset.defaultCharset()
nhưng gần đây chúng tôi phát hiện ra rằng đây có thể không phải là câu trả lời đúng. Tôi đã được thông báo rằng kết quả khác với bộ ký tự mặc định thực được sử dụng bởi các lớp java.io trong một số trường hợp. Có vẻ như Java giữ 2 bộ ký tự mặc định. Có ai có bất kỳ hiểu biết về vấn đề này?
Chúng tôi đã có thể tái tạo một trường hợp thất bại. Đó là một loại lỗi của người dùng nhưng nó vẫn có thể cho thấy nguyên nhân gốc rễ của tất cả các vấn đề khác. Đây là mã,
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;
}
}
Máy chủ của chúng tôi yêu cầu bộ ký tự mặc định bằng tiếng Latin-1 để xử lý một số mã hóa hỗn hợp (ANSI / Latin-1 / UTF-8) trong một giao thức kế thừa. Vì vậy, tất cả các máy chủ của chúng tôi đều chạy với thông số JVM này,
-Dfile.encoding=ISO-8859-1
Đây là kết quả trên Java 5,
Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Ai đó cố gắng thay đổi thời gian chạy mã hóa bằng cách đặt tệp.encoding trong mã. Tất cả chúng ta đều biết điều đó không hiệu quả. Tuy nhiên, điều này dường như ném ra defaultCharset () nhưng nó không ảnh hưởng đến bộ ký tự mặc định thực được sử dụng bởi OutputStreamWriter.
Đây là lỗi hay tính năng?
CHỈNH SỬA: Câu trả lời được chấp nhận cho thấy nguyên nhân gốc rễ của vấn đề. Về cơ bản, bạn không thể tin tưởng defaultCharset () trong Java 5, đây không phải là kiểu mã hóa mặc định được sử dụng bởi các lớp I / O. Có vẻ như Java 6 khắc phục sự cố này.