Почему при выводе символов юникода на консоль Windows 7 из программы Java появляются дополнительные символы? - PullRequest
0 голосов
/ 27 февраля 2019

Ниже приведена Java-программа для печати символа юникода в консоли Windows.

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

public class PrintUnicodeChar {
  public static void main (String[] argv) throws UnsupportedEncodingException {
    String unicodeMessage = "\u00A3"; // Pound sign

    PrintStream out = new PrintStream(System.out, true, "UTF-8");
    out.print(unicodeMessage);
  }
}

Я выбрал Lucida Console в качестве шрифта и установил кодовую страницу на 65001.

Вывод, который я получаюравно £ �

Если я напечатаю знак фунта три раза, используя "\u00A3\u00A3\u00A3", на выходе получится £££ � £.Печать символов с более высоким значением Юникода выводит больше, делая его более искаженным.

Вот еще одна строка "\u00A3\n\u00A3\u00A3\n\u00A3\u00A3\u00A3\n\u00A3\u00A3\u00A3\u00A3\n\u00A3\u00A3\u00A3\u00A3\u00A3\n"

Вывод

£

££

£££

££££

£££££

� £

£££££

� ££

Что происходит?Это проблема с терминалом Windows 7?Как запретить печать дополнительных символов?

1 Ответ

0 голосов
/ 27 февраля 2019

В вашем коде нет ничего плохого.

Проблема возникла, потому что Windows не поддерживает UTF-8 в свойстве консоли [похожая проблема в python: Как отобразить utf-8 в Windowsconsole ]

Вы можете обойти эту проблему, напечатав в файл следующим образом:

PrintStream out = new PrintStream(new FileOutputStream(fileDir), true, "UTF8");

Полный код:

public static void main(String[] args) throws IOException {
    String unicodeMessage = "\u00A3"; // Pound sign
    File fileDir = new File("c:\\temp\\test.txt");
    PrintStream out = new PrintStream(new FileOutputStream(fileDir), true, "UTF-8");
    out.print(unicodeMessage);
}

Другое решение: ВыполнитьВаш код в Docker на Linux Vm (во избежание проблем, связанных с Windows)

...