Символы CJK UTF-8, не отображаемые на Java

Я читал в кодировке 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.

Ответ 1

System.out.println(sb);

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

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

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

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

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

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

Ответ 3

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

  • шрифт Arial Unicode MS
  • script является Hangul

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

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

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