Символы 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 с помощью Запустить конфигурацию.
В моем блоге можно найти несколько сообщений о предмете - через мой профиль.
Ответ 2
Да, вам нужно изменить кодировку консоли Eclipse, как описано в этой статье how-to-display-chinese-character-in-eclipse-console
Ответ 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 или аналогичный однобайтовый набор символов.