从windows控制台中的Java代码问题打印unicode

从windows控制台中的Java代码问题打印unicode,java,unicode,encoding,utf-8,cmd,Java,Unicode,Encoding,Utf 8,Cmd,我在windows控制台中打印unicode符号时遇到问题 下面是打印unicode符号值的java代码 System.out.print("\u22A2 "); 当我在Eclipse中以UTF-8的编码设置运行程序时,这个问题并不存在,但是当涉及到windows控制台时,这个符号会被一个问号代替 为了克服这个问题,采取了以下措施,但没有成功 将windows console的字体更改为Lucida console 每次运行windows console时,我都会更改编码设置,即使用chcp

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

下面是打印unicode符号值的java代码

System.out.print("\u22A2 ");
当我在Eclipse中以UTF-8的编码设置运行程序时,这个问题并不存在,但是当涉及到windows控制台时,这个符号会被一个问号代替

为了克服这个问题,采取了以下措施,但没有成功

  • 将windows console的字体更改为Lucida console

  • 每次运行windows console时,我都会更改编码设置,即使用
    chcp 65001


我尝试过几次的另一个步骤是运行带有参数的java文件,即
java-Dfile.encoding=UTF-8 Filter
(其中“Filter”是类的名称)

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

不幸的是,Java设计人员选择使用所谓的“默认”编码打开标准流,在Windows下,这种编码几乎总是不可用*)。因此,天真地使用
System.out
System.err
会使程序输出的显示方式有所不同,具体取决于您运行它的位置。这与目标背道而驰:编译一次,在任何地方运行

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

在JDK7中,以下内容通常适用于我:

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

对于古代Java版本,我将
标准字符集.UTF_8
替换为
字符集.forName(“UTF-8”)
对于阿拉伯语,我使用了以下代码:

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

默认情况下,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

你确定控制台是用unicode运行的吗?可能是win-1252什么的。我猜你已经读过了。我不知道该如何检查它,我看到了一个某人控制台的屏幕截图,在他的选项中,他会有关于他使用什么编码的信息,但是我的没有显示出来。@GGrec没有,因为这与输入有关,我没有发现它MS C运行时不支持UTF-8;即使您在控制台中将chcp设置为65001,也可能会遇到破坏应用程序的错误。没有可靠的方法将Unicode标准输出发送到Windows控制台。如果您一定要这样做,那么就有Win32 API
WriteConsoleW
,但它显然只在Windows上工作,它需要仔细处理,以检测您是否正在与Windows控制台、其他控制台或文件或管道进行通信,而您不能用纯Java调用它(您需要)。感谢您的回复,我已经尝试使用PrintStream,但它似乎无法解决问题。也许是我做错了什么,但以下是我所做的;PrintStream sysout=新的PrintStream(System.out,true,“UTF-8”);sysout.print(“\u22A2”);再一次,它在Eclipse中运行良好,但在windows控制台中无法运行。请看我的编辑@Adrian。然后它应该将字符串打印为⊢我真的很感谢你的帮助,但我不知道为什么它已经不起作用了。。我已经非常仔细地遵循了您的解决方案,尝试了两种字符集,它不仅起作用。。我总是尝试我能想到的所有选择,但嗯。。我甚至用编码编译了java文件,使用了javac编码utf8*.javai上次我在控制台(WindowsXP)上打印了太多字符。