Очевидный ответ - использовать, 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;
}
}
Нашему серверу требуется кодировка по умолчанию в Latin-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, которая не является кодировкой по умолчанию, используемой классами ввода-вывода. Похоже, Java 6 исправляет эту проблему.