windows控制台(java)System.out.println()中的西里尔文;

windows控制台(java)System.out.println()中的西里尔文;,java,encoding,utf-8,Java,Encoding,Utf 8,当我写一些西里尔文字时,System.out.println(“Пчззы”)-然后它输出这个╨єёёъшщ  ч√ъ,使用windows控制台,如何修复此问题?文件编码为utf-8,但没关系,当它是ansii或windows-1251时,输出相同。尽管您可以通过chcp 65001将windows控制台切换到utf-8,但您可能仍然无法正确查看utf-8输出。这可能不是您想要的,但至少是一个选择:将标准输出重定向到文件。将源文件另存为UTF-8,并使用UTF-8编码进行编译。可以使用支持UTF

当我写一些西里尔文字时,System.out.println(“Пчззы”)-然后它输出这个╨єёёъшщ  ч√ъ,使用windows控制台,如何修复此问题?文件编码为utf-8,但没关系,当它是ansii或windows-1251时,输出相同。

尽管您可以通过chcp 65001将windows控制台切换到utf-8,但您可能仍然无法正确查看utf-8输出。这可能不是您想要的,但至少是一个选择:将标准输出重定向到文件。将源文件另存为UTF-8,并使用UTF-8编码进行编译。可以使用支持UTF-8的文本编辑器查看重定向的输出文件

String s = "Русский язык";
System.setOut(new PrintStream(new FileOutputStream("out.txt"), true, "UTF-8"));
System.out.println(s);

由于历史原因(还记得DOS吗?),Windows控制台将编码CP866用于西里尔文。Windows控制台绝对不支持Unicode

(唉,我身边没有Windows机器提供经过测试的代码片段。)

请注意,您可能会在输出中看到一些尾随垃圾(我看到),但如果您将输出重定向到文件,您将看到这只是一个显示伪制品

因此,您可以通过使用。使用平台编码(我用的是cp1252),没有西里尔字符

关于编码业务的附加说明:

D:\Temp :: chcp 1251
Aktive Codepage: 1251.
:: This is another codepage (8 bits only) that maps bytes to cyrillic characters.
:: Edit the source file to have:
::      PrintStream ps = new PrintStream(System.out, true, "Windows-1251");
:: We intend to match the console output; else we won't get the expected result.
D:\Temp :: javac -encoding utf-8 Kyrill.java && java Kyrill
12
??????? ????
Русский язык

因此,您可以看到,与一些人所认为的相反,Windows控制台对Unicode的理解是随意的,它可以打印希腊语和俄语。

我不认为Windows控制台支持Unicode输出……这篇文章可能会帮助您执行java代码,这是错误的。首先,
cmd.exe
不是“DOS”,暗示它是相关的是误导。第二,它在操作试图使其工作的方式上具有“Unicode能力”。@Lumi:(1)旧的16位DOS使用了现在称为CP866的编码。现代的32位和64位Windows必须效仿,尽管在GUI部分使用了另一种8位西里尔编码(CP1251),在Unicode API中使用了正确的Unicode。(2) “支持Unicode”将至少能够显示所有基面字符;上次检查时,Windows控制台仅支持8位编码。如果情况发生了变化,这是一个好消息。这听起来是正确的。欢迎的消息很简单。完全支持BMP意味着多种语言,也包括从右到左的语言,如阿拉伯语,这可能需要不同版本的
cmd.exe
,当然,您需要安装适当的控制台字体,我甚至不确定它是否存在,可能是的,我复制了你代码的第一部分,完全按照你说的做了,但是输出还是一团糟。所以你所看到的并不是所有windows控制台的普遍真理。注意:我使用的是windows 7 64位专业版英文版。@dragon66-您是否使用UTF-8作为源文件编码?如果不是,那就是你陷入困境的原因。否则,定义“mess”。是的,我做了,我看到的是:C:\work temp>javac-encoding utf-8 Kyrill.java C:\work temp>javac-encoding utf-8 Kyrill.java&&java Kyrill 12????╨á╤â╤ü╤ü╨║╨╕╨╣ ╤Å╨╖╤ï╨║您似乎错过了将控制台窗口切换到UTF-8的
chcp 65001
命令。不,我只是没有在评论中包含它。
D:\Temp :: chcp 1251
Aktive Codepage: 1251.
:: This is another codepage (8 bits only) that maps bytes to cyrillic characters.
:: Edit the source file to have:
::      PrintStream ps = new PrintStream(System.out, true, "Windows-1251");
:: We intend to match the console output; else we won't get the expected result.
D:\Temp :: javac -encoding utf-8 Kyrill.java && java Kyrill
12
??????? ????
Русский язык