【发布时间】:2013-08-04 18:59:10
【问题描述】:
我无法在 00ff 之后打印 unicode 值,而是得到 '?'在 Eclipse 中执行此操作后的字符。这是可以预期的行为吗?
System.out.println("\u01ff");
【问题讨论】:
-
我认为这与您的文件编码有关,尝试将其写入文件并使用记事本之类的编辑器打开它(如果赢了),或者直接在首选项中检查您的编码
我无法在 00ff 之后打印 unicode 值,而是得到 '?'在 Eclipse 中执行此操作后的字符。这是可以预期的行为吗?
System.out.println("\u01ff");
【问题讨论】:
Eclipse 使用默认平台默认编码(在 Windows 中为 cp1252)在保存基于文本的文件和写入标准输出流(System.out 使用)期间解码字符。您需要将其显式设置为 UTF-8 才能实现统治世界。
请注意,这样您也不再需要使用那些 \uXXXX Unicode 转义符来表示基于文本的源文件中的这些字符。
这些问号是因为输出流使用的字符集不支持输入流中指定的字符。
【讨论】:
System.out 编码)。这就是为什么我认为它不能解决 OP 的问题。您对环境的评论是有效的,但您的答案中缺少该信息。此外,并非所有环境都允许您在命令行上指定-Dfile.encoding=UTF-8 或将JAVA_TOOL_OPTIONS 环境变量设置为包含-Dfile.encoding=UTF8。从代码中施加显式控制要好得多。
问题在于System.out 使用的编码;默认情况下,它是您平台的本机编码(通常不是 UTF-8)。您可以通过替换流来显式更改编码:
try {
PrintStream ps = new PrintStream(System.out, true, "UTF-8");
System.setOut(ps);
} catch (UnsupportedEncodingException error) {
System.err.println(error);
}
在此之后(除非底层环境出现字体或编码问题),所有 Unicode 字符都应在 System.out 上正确打印。
编辑根据我和 BalusC 在his answer 上的反复讨论,这还不足以(甚至是必要的)让事情在 Eclipse 中运行。您有两个问题需要解决:在写入System.out 时使用正确的编码,然后在Eclipse 控制台视图中显示控制台输出时使用正确的编码。 BalusC 的回答解决了这两个问题。不幸的是,它不能解决在 Eclipse 之外运行的问题。为此,您需要使用我上面的方法或设置默认的运行时编码。这可以通过在命令行上使用标志-Dfile.encoding=UTF-8 或设置环境变量JAVA_TOOL_OPTIONS 以包含-Dfile.encoding=UTF-8 来完成。要在 Eclipse 之外成功运行代码,这可能是最好的方法。
【讨论】:
Java 可以很好地处理这些字符。但是输出团队会有特定的编码。
除非该编码是 UTF-8 或 UTF-16 之类的,否则它无法以 Unicode 编码每个字符。而当它遇到一个它不能表示的字符时,它会被一个问号代替。
【讨论】:
JVM 也使用System.out 的默认文件编码。
例如,在 Linux 上,如果您的 $LANG 变量设置为 de_DE.UTF-8,则 file.encoding 的值将相应导出,并设置为 utf-8。
如果JVM不能派生出你想要的设置,你可以通过设置系统属性来改变文件编码:
java -Dfile.encoding=utf-8 ...
在命令行上。
您也可以在 Eclipse 中使用 运行配置 执行此操作(上下文菜单 - 运行方式 - 运行配置 ... - 参数 - VM 参数)
所以这对命令行和Eclipse都有效,并且不需要在源代码中明确定义编码。
如果值设置为
java -Dfile.encoding=iso-8859-1
例如,只能表示 Unicode 字符的子集,因为该字符集仅支持有限数量的字符。其他的将显示为?。
还有两点需要牢记:
接收流的设备(终端、外壳等)必须正确解码。以 GNOME 的终端为例,您可以在菜单中设置字符编码。
该终端等使用的字体必须包含该字符的图形表示
【讨论】: