3

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

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

4

3 回答 3

2

看到这个问题。当 Java 的默认字符编码不是 UTF-8 时(在 Windows 和 OS X 上似乎是这种情况,而不是 Linux),则无法编码的字符将转换为问号。您可以将正确的开关(-Dfile.encoding=UTF-8在某些终端上,但我面前没有 Windows 框)传递给 JVM 的命令行,或者您可以设置一个环境变量。便携式确定这应该是不可能的,但是如果您知道您将始终在 Win32 控制台上运行,例如,您可以选择一个Charset在将字符写入标准输出之前显式编码字符,或者您可以直接编写你需要的字节。

于 2011-02-24T04:21:24.427 回答
2

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

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

您可以在此处此处此处此处阅读更多内容。

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

于 2011-02-24T08:45:09.187 回答
0

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

我不是 Java 程序员,但在 C 语言的情况下,您必须在打印 UTF-16 实际工作之前_setmode()使用特殊模式调用。_O_U16TEXT

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

祝你好运!

于 2011-02-24T07:22:38.087 回答