当我写一些西里尔文本,System.out.println(“Русскийязык”) - 然后它推出这个╨єёёъшщч√ъ,使用Windows控制台,怎么可以这个修复?,文件编码是utf-8 ,但无关紧要,当它是ansii或windows-1251时,输出的相同。
答案 0 :(得分:8)
import java.io.PrintStream;
class Kyrill {
public static void main(String args[])
throws java.io.UnsupportedEncodingException
{
String ru = "Русский язык";
PrintStream ps = new PrintStream(System.out, true, "UTF-8");
System.out.println(ru.length());
System.out.println(ru);
ps.println(ru);
}
}
D:\Temp :: chcp 65001
Aktive Codepage: 65001.
D:\Temp :: javac -encoding utf-8 Kyrill.java && java Kyrill
12
??????? ????
Русский языкй язык
请注意,您可能会在输出中看到一些尾随垃圾(我这样做)但如果您将输出重定向到文件,您会发现这只是一个显示器。
因此,您可以使用PrintStream使其工作。 System.out使用平台编码(对我来说是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 ,它可以打印希腊语和俄语。
答案 1 :(得分:2)
虽然您可以通过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);
答案 2 :(得分:1)
Windows控制台因为历史原因(请记住DOS?)使用Cyrillic编码CP866。 Windows控制台绝对不支持Unicode。
(唉,我没有Windows机器来提供经过测试的代码片段。)