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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows控制台中的unicode字符比预期的多相关的知识,希望对你有一定的参考价值。

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

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

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

打印出德语和俄语字符,但文字比我预期的要多一些(用红色加下划线):

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

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

答案

每次打开或写入文件时,都会应用某种编码。但有时我们会忘记我们的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. 一切都正确显示。

这并不能证实这一点,但它确实证实了如果以正确的编码预见内容,DOS可以完成这项工作。

Aaditi:

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

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

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

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

另一答案

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

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

另一答案

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

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

以上是关于Windows控制台中的unicode字符比预期的多的主要内容,如果未能解决你的问题,请参考以下文章

Perl:将 Unicode 字符串打印到 Windows 控制台

在 Windows 终端中输出 unicode 字符

Visual Studio 2012 远程操作花费的时间比预期的要长

是否可以使用 MinGW 在 Windows XP 控制台上获取 unicode 字符?

当print()unicode字符时,python 3.5与3.6的差异?

C++ 中的 Unicode 字符串索引