我想在 Windows 控制台中打印俄语和德语字符。 所以我写了一个小测试程序来了解它的工作情况:
PrintStream ps = new PrintStream(System.out, false, "UTF-8");
ps.println("öäüß гджщ");
然后我启动cmd.exe,把它的字体改成支持Unicode的Lucida Console,把code page改成Unicode "chcp 65001",然后执行我的程序。
德文和俄文字符已打印,但文字比我预期的多一点(红色下划线):
但是文本在 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 可以完成这项工作。
编辑 2:
@ka3ak 已经 2 年多了,但在阅读一本关于 Java I/O 的书时,我偶然发现了以下内容。
System.console().printf(...)
has better support for special characters than theSystem.out.println(...)
method.
因为 PrintStream
只是环绕 System.out
流,我猜你也有同样的限制。我想知道这是否可以解决问题。如果它仍然重要,请试一试。 :)
stackoverflow 上的其他帖子报告了类似的事情:console.writeline and System.out.println
关于java - Windows 控制台中的 unicode 字符比预期的多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13744076/