扩展的Ascii在控制台中不起作用!

时间:2011-02-24 04:07:32

标签: java character-encoding console ascii extended-ascii

例如 的System.out.println( “╚”); 显示为?,同样适用于System.out.println(“\ u255a”);

为什么这不起作用? Stdout确实支持这些角色所以我不明白。

3 个答案:

答案 0 :(得分:2)

this question。当Java的默认字符编码不是UTF-8时 - 就像在Windows和OS X上,而不是Linux那样 - 那么无法编码的字符会被转换为问号。您可以将正确的开关(-Dfile.encoding=UTF-8在某些终端上传递给我,但我没有在我面前的Windows框)到JVM的命令行,或者您可以设置环境变量。例如,如果你知道你将永远在Win32控制台上运行,你可以选择Charset来显式编码字符,然后再将它们写入标准输出,或者你可以直接写出你需要的字节。

答案 1 :(得分:2)

Windows命令提示符默认使用旧的DOS OEM编码。 System.out使用默认的系统编码,它将是Windows“ANSI”编码。但是,System.console()会检测控制台的编码。

OEM代码页更可能支持U + 255A(╚),因为这些范围用于Windows中的重音字符。

您可以阅读更多herehereherehere

就个人而言,我会避免使用代码页65001的-Dfile.encoding选项,因为这会在控制台(批处理文件停止工作)和Java(bugs)中产生意外的副作用。

答案 2 :(得分:0)

如果您使用的是Windows,则控制台不是UTF-8,而是UTF-16,它与Java使用的是相同的本机编码,因此您应该能够直接打印宽字符串。

我不是Java程序员,但在C的情况下,您必须使用特殊模式_setmode()调用_O_U16TEXT,然后才能打印UTF-16。

如果要打印多字节字符串,可以使用chcp 65001从命令行将Windows控制台设置为UTF-8,或者从Win32 API SetConsoleOutputCP()以编程方式将Windows控制台设置为UTF-8,但要注意{{1}的错误返回写入的字符数,而不是记录的写入字节数。此错误导致Windows控制台上的UTF-8从Perl,PHP和Ruby中损坏。我相信即使是MSVCRT也会成为受害者。

祝你好运!