在Windows控制台中从Java代码问题中打印出unicode

我在Windows控制台中打印出unicode符号时遇到问题。

这是打印出unicode符号值的java代码;

System.out.print("\u22A2 "); 

当我在Eclipse中使用UTF-8编码设置运行程序时,问题不存在,但是当涉及到Windows控制台时,符号会被问号替换。

以下是为了尝试克服这个问题,没有成功;

  • 将Windows控制台的字体更改为Lucida Console。

  • 每次运行Windows控制台时,我都会更改编码设置,即使用chcp 65001

我尝试了几次的额外步骤是使用参数运行java文件,即java -Dfile.encoding=UTF-8 Filter (其中“Filter”是类的名称)

默认情况下,在Windows的CMD中使用的代码页是437 。 您可以在提示符中运行此命令进行测试:

 C:\>chcp Active code page: 437 

并且,此代码页会阻止您正确显示Unicode字符! 您必须将代码页更改为65001并使用-Dfile.encoding = UTF-8来实现此目的。

 C:\>chcp 65001 Active code page: 65001 C:\>java -jar -Dfile.encoding=UTF-8 path/to/your/runnable/jar 

除了您采取的步骤之外,还需要一个PrintStream / PrintWriter,它将打印的字符编码为UTF-8。

不幸的是,Java设计人员选择在Windows下使用所谓的“默认”编码打开标准流,这种编码几乎总是无法使用。 因此,使用System.outSystem.err将使您的程序输出显示不同,具体取决于您运行它的位置。 这与目标直接相反:编译一次,随处运行。

*)除了微软在这个星球上认可之外,它将是一些非标准的“代码页”。 和AFAIK一样,例如你有一个德国键盘和一个“德国”OEM Windows,你想在你的家乡时区有日期和时间,没有办法说:但我想要UTF-8输入/输出我的CMD窗口。 这就是我大部分时间都启动双Ubuntu的原因之一,不用说终端会使用UTF-8。

以下通常适用于JDK7:

 public static PrintWriter stdout = new PrintWriter( new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true); 

对于古代Java版本,我用Charset.forName("UTF-8")替换StandardCharsets.UTF_8

对于阿拉伯语,我使用以下代码:

 PrintWriter stdout = new PrintWriter( new OutputStreamWriter(System.out,StandardCharsets.ISO_8859_1),true);