2015-12-18 3 views
2

Я пытаюсь создать настраиваемый поток печати, который может печатать локализованные сообщения на консоли. Я столкнулся с проблемой, связанной с Windows. Вот то, что я пытаюсь сделатьПечать юникода на консоль

  • У меня есть строки Юникод
  • Преобразовать юникод строку байтов, используя UTF-8 кодировке
  • Преобразование байта в новую строку с консоли кодирования
  • печати новый строка для консоли с консольным кодированием

В этом коде я попытался выполнить описанные выше шаги, но это не получилось с треском. Странно, что вызов по умолчанию System.out.println работает правильно. Тем не менее, я хочу использовать собственный поток печати и не полагаться на System.out по умолчанию.

Может кто-нибудь объяснить, как я могу печатать unicode на консоли, используя мой собственный поток печати? И почему система System.out по умолчанию уже готова правильно печатать?

Вот мой код - я скомпилировал его и запустил из командной строки. Я заранее установил свой системный язык в zh-CN.

public static void main(String[] args) throws Exception{ 
    Charset defaultCharset = Charset.defaultCharset(); 
    System.out.println(defaultCharset); 
    // charset is windows-1252 

    String unicodeMessage = 
      "\u4e16\u754c\u4f60\u597d\uff01"; 

    System.out.println(unicodeMessage); 
    // string is printed correctly using System.out (世界你好!) 


    byte[] sourceBytes = unicodeMessage.getBytes("UTF-8"); 
    String data = new String(sourceBytes , defaultCharset.name()); 

    PrintStream out = new PrintStream(System.out, true, defaultCharset.name()); 
    out.println(data); 
    // prints gibberish: ??–???????????? 
} 

ответ

2

Окошко-1252 проблема здесь. Нам нужно использовать кодировку UTF-8 для печати. Следующие работали для меня:

public static void main(String[] args) throws Exception{ 
    Charset utf8Charset = Charset.forName("UTF-8"); 
    Charset defaultCharset = Charset.defaultCharset(); 
    System.out.println(defaultCharset); 
    // charset is windows-1252 

    String unicodeMessage = "\u4e16\u754c\u4f60\u597d\uff01"; 

    System.out.println(unicodeMessage); 
    // string is printed correctly using System.out (世界你好!) 


    byte[] sourceBytes = unicodeMessage.getBytes("UTF-8"); 
    String data = new String(sourceBytes , defaultCharset.name()); 

    PrintStream out = new PrintStream(System.out, true, utf8Charset.name()); 
    out.println(data); 
} 
+0

Вы используете преобразование ошибочного кодирования OP. Вы уверены, что используете ту же кодовую страницу Windows и Charset по умолчанию? –

0

У вас есть ряд проблем и недоразумений. Во-первых,

byte[] sourceBytes = unicodeMessage.getBytes("UTF-8"); 
String data = new String(sourceBytes , defaultCharset.name()); 

data теперь полон кракозябры - вы декодируется UTF-8 в Windows-1252. Затем вы печатаете эту строку с помощью кодировщика UTF-8. Затем System.out кодирует кодовую страницу вашей консоли. У него три уровня нарушения.

Теперь причина заключается в том, что вы правильно установили свой язык. Java использует это (кодовая страница консоли), а не defaultCharset для настройки консоли.

Проблема заключается в том, что консоль Windows не поддерживает UTF-8. Вы будете хорошо печатать символы из вашей кодовой страницы, но не другие. Найдите другое решение, например, запись в файл или отправку результатов на веб-страницу.

+0

Спасибо, я все еще изучаю путь кодирования. Вы говорите, что «Java использует это (кодовая страница консоли)». Есть ли способ заставить мой новый поток печати также использовать «кодовую страницу консоли»? –

+0

Я не уверен, чего вы пытаетесь достичь. 'System.out.println()' работает правильно, так почему вы хотите использовать PrintStream? –

Смежные вопросы