UTF-8 CJK символы не отображаются в Java - PullRequest
12 голосов
/ 11 мая 2011

Я некоторое время читал о кодировке Unicode и UTF-8, и, думаю, я это понимаю, поэтому, надеюсь, это не будет глупым вопросом:

У меня есть файл, содержащий несколько символов CJK и сохраненный как UTF-8. У меня установлены различные азиатские языковые пакеты, и символы правильно отображаются другими приложениями, поэтому я знаю, что многое работает.

В моем приложении Java я прочитал файл следующим образом:

// Create objects
fis = new FileInputStream(new File("xyz.sgf"));
InputStreamReader is = new InputStreamReader(fis, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(is);

// Read and display file contents
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
    sb.append(line);
}
System.out.println(sb);

В выходных данных символы CJK отображаются как '???'. Звонок на is.getEncoding() подтверждает, что он определенно использует UTF-8. Какой шаг мне не хватает, чтобы персонажи выглядели правильно? Если это имеет значение, я смотрю на вывод, используя консоль Eclipse.

Ответы [ 4 ]

16 голосов
/ 11 мая 2011
System.out.println(sb);

Проблема в приведенной выше строке. Это будет кодировать символьные данные, используя системную кодировку по умолчанию, и отправлять данные в STDOUT. Во многих системах это процесс с потерями.

При изменении значений по умолчанию кодировка, используемая System.out, и кодировка, используемая консолью, должны совпадать.

Единственный поддерживаемый механизм для изменения кодировки системы по умолчанию - через операционную систему. (Некоторые советуют использовать системное свойство file.encoding, но это не поддерживается и может иметь непредвиденные побочные эффекты.) Вы можете использовать setOut для своего собственный кастом PrintStream:

PrintStream stdout = new PrintStream(System.out, autoFlush, encoding);

Вы можете изменить кодировку консоли Eclipse с помощью Запустить конфигурацию .

Вы можете найти ряд сообщений на эту тему в моем блоге - через мой профиль.

5 голосов
/ 09 марта 2012

Следующая программа печатает символы CJK на консоли с помощью TextPad.Чтобы увидеть корейский хангыль и японскую хирагану, мне пришлось сказать Java изменить кодировку потока печати на EUC_KR и установить свойства окна вывода инструмента TextPad:

  • шрифт - Arial Unicode MS
  • скрипт - хангыль

import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

class Hangul {

    public static void main(String[] args)  throws Exception {

        // Change console encoding to Korean

        PrintStream out = new PrintStream(System.out, true, "EUC_KR");
        System.setOut(out);

        // Print sample to console

        String go_hello  = "가다 こんにちは";
        System.out.println(go_hello);
    }
}

Вывод инструмента:

가다 こ ん に ち は

4 голосов
/ 11 мая 2011

Да, вам нужно изменить кодировку консоли Eclipse, как описано в этой инструкции по отображению китайских символов в eclipse-console article

2 голосов
/ 11 мая 2011

В зависимости от вашей платформы весьма вероятно, что ваша консоль (или Windows CMD) не поддерживает или не использует набор символов UTF-8 и поэтому преобразует все не отображаемые символы в знак вопроса.

В Windowsнапример CMD почти всегда использует WIN1252 или подобный однобайтовый набор символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...