Когда вы открываете файл для чтения, вам нужно явно указать кодировку, которую вы хотите использовать для чтения файла:
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.