ISO 8859-1 Кодирование файлов, напечатанных в программе Java - PullRequest
5 голосов
/ 08 сентября 2011

Я пишу программу, которая реализует файловую структуру, программа распечатывает файл продукта на основе этой структуры. Названия продуктов включают буквы Æ, Ø и Å. Эти буквы не отображаются правильно в выходном файле. Я использую

PrintWriter printer = new PrintWriter(new FileOutputStream(new File("products.txt")));

IS0 8859 - 1 или Windows ANSI (CP 1252) - это наборы символов, которые запрашивает реализация.

1 Ответ

5 голосов
/ 08 сентября 2011

Есть две возможности:

  • При выводе файла 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 (). Это утомительно, так что, возможно, есть лучший способ.

Не знаю.

...