在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.out
和System.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);