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