Ответ 1
Когда вы открываете файл для чтения, вам нужно явно указать кодировку, которую вы хотите использовать для чтения файла:
Reader r = new InputStreamReader(new FileInputStream("myfile"), StandardCharsets.UTF_8);
Тогда значение кодировки платформы по умолчанию (которую вы можете изменить с помощью -Dfile.encoding
) больше не имеет значения.
Примечание:
Обычно я рекомендую всегда указывать кодировку явно для любой операции, которая зависит от стандартной локали, такой как символьный ввод-вывод. Многие методы Java API по умолчанию используют платформенную кодировку, которую я считаю плохим дизайном, потому что часто кодирование платформы не является правильным, а также может внезапно меняться (если пользователь, например, переключает локаль ОС), разбивая ваше приложение.
Так что просто скажите, какую кодировку вы хотите.
Есть некоторые случаи, когда кодирование платформы является правильным (например, при открытии файла, который только что создал пользователь для вас), но они довольно редки.
Примечание 2:
java.nio.charset.StandardCharsets
был введен в Java 1.7. Для более старых версий Java вам нужно указать входную кодировку как строку (ть). Список возможных кодировок зависит от JVM, но каждый JVM, по крайней мере, имеет:
US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16.