我想在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仍然很有趣。
答案 0 :(得分:1)
每次打开或写入文件时,都会应用某种编码。但有时我们会忘记我们的IDE(在你的情况下是Eclipse)也有编码。
当您在引号之间键入特定文本时,它会以特定编码显示并键入,即IDE的编码。 您的假设是输出流(UTF-8)的编码也将保证文本以特定编码显示。但是,我想在这里再次应用IDE的编码。
我建议仔细检查你的eclipse编码。也许这可以解决你的问题。当然值得一试,不是吗? :)
对于全局编码设置,请将以下代码添加到eclipse.ini文件
-Dfile.encoding=UTF-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。