Очевидным ответом является использование 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
Кто-то пытается изменить время выполнения кодировки, установив файл. encoding в коде. Мы все знаем, что это не сработает. Однако это, по-видимому, сбрасывает defaultCharset(), но это не влияет на реальную кодировку по умолчанию, используемую OutputStreamWriter.
Это ошибка или функция?
EDIT: принятый ответ показывает основную причину проблемы. В принципе, вы не можете доверять defaultCharset() в Java 5, который не является кодировкой по умолчанию, используемой классами ввода-вывода. Похоже, что Java 6 исправляет эту проблему.