例如 的System.out.println( “╚”); 显示为?,同样适用于System.out.println(“\ u255a”);
为什么这不起作用? Stdout确实支持这些角色所以我不明白。
答案 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()
会检测控制台的编码。
就个人而言,我会避免使用代码页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也会成为受害者。