我想在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
编辑:
我想添加以下内容。我作为实验执行了以下步骤。
这并不能证实这一点,但它确实证实了如果以正确的编码预见内容,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中。