扩展ASCII在控制台中无法使用!

3
例如: System.out.println("╚"); 显示为?,System.out.println("\u255a")也是一样。
为什么不起作用?Stdout确实支持这些字符,所以我不明白。

3
1)"Extended Ascii" 完全没有意义。 2)显然那不是你的代码。 3)使用的操作系统/终端是什么? - Josh Lee
Windows中的命令提示符。扩展ASCII就是它的名称。 - user328898
1
@jleedev告诉OP你真正的感受... - Brian Driscoll
@DasWood,您提到的“Extended ASCII”是指非打印字符吗?因为如果是这样的话,那么它们不会显示。据我所知,大多数控制台仅在0-127范围内显示,但我从未真正研究过,所以可能我错了。 - Brian Driscoll
3
有时人们会批评“扩展ASCII”这一术语的使用,因为它可能被错误地解释为ASCII标准已更新以包含超过128个字符,或者该术语明确地识别了单个编码,这两种情况都是不正确的。 - Christoffer Hammarström
显示剩余4条评论
3个回答

2
请参考这篇文章。当Java的默认字符编码不是UTF-8时,比如在Windows和OS X系统下,但不包括Linux系统,那么无法编码的字符会被转换成问号。你可以通过传递正确的开关(例如-Dfile.encoding=UTF-8),或者设置环境变量,在JVM的命令行中进行设置。虽然确定应该设置什么可能是不可能的,但如果你知道你将始终在Win32控制台上运行,你可以选择一个Charset来显式地对字符进行编码,然后再将它们写入标准输出,或者直接写入所需的字节。

2
Windows命令提示符默认使用旧的DOS OEM编码。System.out使用默认的系统编码,这将是Windows的“ANSI”编码。但是,System.console()检测控制台的编码。
U+255A(╚)更可能受到OEM代码页的支持,因为这些范围用于Windows中的重音字符。
您可以在这里这里这里这里阅读更多信息。
个人而言,我会避免使用编码为65001的-Dfile.encoding选项,因为它会在控制台(批处理文件停止工作)和Java(bugs)中产生意外的副作用。

0

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

我不是Java程序员,但在C的情况下,您必须调用_setmode()并使用特殊模式_O_U16TEXT才能使UTF-16正常工作。

如果您想要打印多字节字符字符串,可以通过命令行使用chcp 65001或从Win32 API SetConsoleOutputCP()以编程方式将Windows控制台设置为UTF-8,但请注意一个错误,即WriteFile()返回写入的字符数而不是文档中所述的写入的字节数。此错误导致Perl、PHP和Ruby上的Windows控制台上的UTF-8损坏。我相信甚至MSVCRT也会受到影响。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接