специальные символы отображаются правильно в Java IDE, но не в программе, запущенной из файла JAR - PullRequest
3 голосов
/ 05 июня 2011

Я пытаюсь создать программу на китайском языке, которая поможет мне изучать китайский язык. Я использую IntelliJ IDEA 10. Основной процесс заключается в том, что моя программа будет читать файл, сохраненный на локальном компьютере, для создания карточек. Файл написан с использованием класса File в Java. При открытии в блокноте все символы отображаются правильно.

Когда я запускаю его в IDE, я могу отображать китайские и пиньиньские символы (в основном гласные с акцентом над ними). Однако, когда я собрал jar-файл и запустил программу оттуда, он больше не может отображать специальные символы и в итоге показывает кучу странных символов.

Есть идеи, почему это так и как это исправить?

Ответы [ 2 ]

4 голосов
/ 05 июня 2011

IntelliJ не использует кодировку по умолчанию для платформы, автоматически определяет на основе кодировки исходных файлов.При запуске кода за пределами IntelliJ необходимо убедиться, что вы явно указали правильную кодировку при чтении / записи файла.Вы можете сделать это, указав его в качестве второго аргумента конструктора InputStreamReader и OutputStreamWriter соответственно.

File file = new File("/foo.txt");
Reader reader = new InputStreamReader(new FileInputStream(file), "UTF-8");
// ...

Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
// ...

Далее вам также необходимо убедиться, чтозритель также поддерживает шрифты.Windows Command Console, например, не поддерживает китайский язык.Вам нужно будет создать приложение Swing для представления результатов.

0 голосов
/ 05 июня 2011

Может быть, это проблема с кодировкой?

В классе File нет методов записи данных в файлы.Для этого вам нужно FileOutputStream или немного Writer.Вы должны опубликовать свой код, который сохраняет файл.(Просто отредактируйте вопрос и добавьте туда свой код.)

Мое первое предположение - вы используете FileWriter.Это звучит просто, но часто неправильно, потому что FileWriter необходимо преобразовать символы в байты, и это происходит с кодировкой по умолчанию , используемой системой по умолчанию.Вы всегда должны указывать кодировку самостоятельно, и, вероятно, UTF-8 - хороший выбор.

Поэтому вместо FileWriter следует использовать следующий код:

Charset utf8 = Charset.forName("UTF-8");
OutputStream os = new FileOutputStream(file);
try {
  Writer wr = new OutputStreamWriter(os, utf8);
  wr.write("whatever strings you want to write");
  wr.close();
} finally {
  os.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...