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

Adr*_*ian 5 java unicode encoding cmd utf-8

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

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

System.out.print("\u22A2 ");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

小智 7

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

C:\>chcp
Active code page: 437
Run Code Online (Sandbox Code Playgroud)

而且,此代码页会阻止您正确显示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
Run Code Online (Sandbox Code Playgroud)


Ing*_*ngo 6

除了您采取的步骤之外,您还需要一个 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);
Run Code Online (Sandbox Code Playgroud)

对于古老的 Java 版本,我替换StandardCharsets.UTF_8Charset.forName("UTF-8")