Windows控制台中的unicode字符比预期的多

时间:2012-12-06 12:55:43

标签: java windows unicode console

我想在Windows控制台中打印俄语和德语字符。 所以我写了一个小测试程序来了解它的工作原理:

PrintStream ps = new PrintStream(System.out, false, "UTF-8");
ps.println("öäüß гджщ");

然后我启动了cmd.exe,将其字体更改为Lucida Console,它支持Unicode,使用“chcp 65001”将代码页更改为Unicode并执行我的程序。

印刷了德语和俄语字符,但文字比我预期的要多一些(用红色加下划线): enter image description here

但是文本在Eclipse控制台中正确打印。有没有办法在Windows控制台中正确打印? 我使用的是Windows 7。

我刚刚用JNI解决了这个问题,但是它是否适用于纯java仍然很有趣。

3 个答案:

答案 0 :(得分:1)

每次打开或写入文件时,都会应用某种编码。但有时我们会忘记我们的IDE(在你的情况下是Eclipse)也有编码。

当您在引号之间键入特定文本时,它会以特定编码显示并键入,即IDE的编码。 您的假设是输出流(UTF-8)的编码也将保证文本以特定编码显示。但是,我想在这里再次应用IDE的编码。

我建议仔细检查你的eclipse编码。也许这可以解决你的问题。当然值得一试,不是吗? :)

对于全局编码设置,请将以下代码添加到eclipse.ini文件

-Dfile.encoding=UTF-8 

修改

我想添加以下内容。我作为实验执行了以下步骤。

  1. 我打开了Notepad ++并创建了一个新文件
  2. 我将编码设置修改为UTF-8
  3. 我复制了您的俄语文本并将其粘贴到我的新文本文件中并保存。
  4. 接下来我打开了我的Windows控制台(“cmd”)
  5. 我执行了“chcp 65001”命令。
  6. 接下来,我在控制台中打印了文件内容:“type file.txt”
  7. 一切都正确显示。
  8. 这并不能证实这一点,但它确实证实了如果以正确的编码预见到内容,DOS可以完成这项工作。

    <强> EDIT2:

    @ ka3ak已经超过2年了,但在读一本关于Java I / O的书时,我偶然发现了以下内容。

      

    System.console().printf(...)System.out.println(...)方法更能支持特殊字符。

    由于PrintStream只是绕过System.out流,我猜你有相同的限制。我想知道这是否可以解决问题。如果仍然重要,请试一试。 :)

    stackoverflow上的其他帖子报告类似的事情:console.writeline and System.out.println

答案 1 :(得分:0)

在阅读了答案和建议后,我得出结论,JRE一定存在问题。也许这个问题只存在于Windows 7中(遗憾的是我没有其他Windows系统可供试验)。

解决方案是使用JNI,或者如果您想要更简单的解决方案,请使用JNA。我找到了一个有用的JNA示例,它解决了我的问题,这里https://stackoverflow.com/a/8921509/971355

答案 2 :(得分:0)

这是因为Windows中的cp65001实现了1/4。请参阅@eryksun’s answer中的完整披露。

简短摘要:在Windows 7中,只有7位(sic!)输入/输出在cp65001中可靠地工作(除非CRTL提供解决方法)。输出问题在Windows 8中得到修复。输入问题出现在Windows 10。