Есть две возможности:
- При выводе файла Java использует неправильную кодировку.
- Файл на самом деле правильный, и все, что вы используете для отображения файла, использует неправильную кодировку.
Предполагая, что проблема является первой, основная причина заключается в том, что Java выяснила, что кодировка по умолчанию для платформы отличается от той, которую вы хотите / ожидаете. Есть три способа решить эту проблему:
Выясните , почему Java имеет стандартную локализацию и кодировку "неправильно" и исправляет это. Это будет связано с настройками локали вашей операционной системы ...
Прочтите этот FAQ для получения подробных сведений о том, как можно переопределить настройки локали по умолчанию в командной строке.
Используйте конструктор PrintWriter
, который явно указывает кодировку, чтобы ваше приложение не полагалось на кодировку по умолчанию. Например:
PrintWriter pw = new PrintWriter("filename", "ISO-8859-1");
В ответ на этот комментарий:
У всех PrintWriters есть ошибка, о которой вы не можете знать, что с ними произошла ошибка?
- Это не ошибка, это особенность дизайна.
- Вы можете узнать, была ли ошибка. Вы просто не можете узнать, что это было.
- Если вам это не нравится, вместо этого вы можете использовать
Writer
.
Они не вызовут исключение или даже не вернут ошибку, если вы попытаетесь подсунуть им кодовую точку, которая не вписывается в обозначенную кодировку.
Как и обычный Writer
, я верю ... если только вы специально не создадите его для этого. Обычное поведение заключается в замене любой не отображаемой кодовой точки определенным символом, хотя это не указано в javadocs (IIRC).
Они даже говорят, заполняет ли вас файловая система; Кажется, я помню, что они этого не делают.
Это правда. Тем не менее:
Для типа файла, который вы обычно пишете с использованием PrintWriter
, это не является критической проблемой.
Если это критическая проблема И вы все еще хотите использовать PrintWriter
, вы всегда можете позвонить checkError()
(IIRC), чтобы узнать, произошла ли ошибка.
Я всегда заканчиваю тем, что пишу свой конструктор OutputStreamWriter с явным вторым аргументом Charset.forName ("UTF-8"). NewEncoder (). Это утомительно, так что, возможно, есть лучший способ.
Не знаю.