2

当我写一些西里尔文字时, System.out.println("Русский язык") - 然后它超过了这个╨єёёъшщ ч√ъ,使用 Windows 控制台,如何解决这个问题?,文件编码是 utf-8,但它没关系,当它是 ansii 或 windows-1251 时,它输出相同。

4

3 回答 3

9
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 ,因为它可以打印希腊语和俄语。

于 2012-04-13T22:13:13.880 回答
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);
于 2012-04-13T19:24:37.267 回答
0

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

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

于 2012-04-13T19:32:32.197 回答