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
编辑:
我想添加以下内容。我作为实验执行了以下步骤。
- 我打开了Notepad ++并创建了一个新文件
- 我将编码设置修改为UTF-8
- 我复制了您的俄语文本并将其粘贴到我的新文本文件中并保存。
- 接下来我打开了我的Windows控制台(“cmd”)
- 我执行了“chcp 65001”命令。
- 接下来,我在控制台中打印了文件的内容:“type file.txt”
- 一切都正确显示。
这并不能证实这一点,但它确实证实了如果以正确的编码预见内容,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 控制台
Visual Studio 2012 远程操作花费的时间比预期的要长
是否可以使用 MinGW 在 Windows XP 控制台上获取 unicode 字符?