I can not print the unicode values after 00ff Instead I'm getting '?' character after execution of this in Eclipse. Is that an expectable behaviour?
System.out.println("\u01ff");
Eclipse 在保存基于文本的文件和写入标准输出流(由 使用System.out
)期间默认使用平台默认编码(在 Windows 中为 cp1252)来解码字符。您需要将其显式设置为 UTF-8 才能实现世界统治。
请注意,这样您也不再需要使用那些\uXXXX
Unicode 转义来表示基于文本的源文件中的这些字符。
这些问号是因为输出流使用的字符集不支持输入流中指定的字符。
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 在他的回答上的反复讨论,这还不足以(甚至没有必要)让事情在 Eclipse 中工作。您有两个问题需要解决:在写入时System.out
使用正确的编码,然后在 Eclipse 控制台视图中显示控制台输出时使用正确的编码。BalusC 的回答解决了这两个问题。不幸的是,它不能解决在 Eclipse 之外运行的问题。为此,您需要使用我上面的方法或设置默认的运行时编码。这可以通过使用-Dfile.encoding=UTF-8
命令行上的标志或将环境变量设置JAVA_TOOL_OPTIONS
为 include 来完成-Dfile.encoding=UTF-8
。要在 Eclipse 之外成功运行您的代码,那么这可能是最好的方法。
Java 可以很好地处理这些字符。但是输出团队会有特定的编码。
除非这种编码是 UTF-8 或 UTF-16 之类的,否则它无法对 Unicode 中的每个字符进行编码。而当它遇到一个它不能表示的字符时,它会被一个问号代替。
JVM 也使用默认文件编码System.out
。
例如,在 Linux 上,如果您的$LANG
变量设置为de_DE.UTF-8
,则 for 的值file.encoding
将相应派生,并设置为utf-8
。
如果 JVM 无法派生您想要的设置,您可以通过设置系统属性来更改文件编码:
java -Dfile.encoding=utf-8 ...
在命令行上。
您也可以在Eclipse中使用运行配置来执行此操作(上下文菜单 - 运行方式 - 运行配置 ... - 参数 - VM 参数)
所以这对命令行和Eclipse都有效,并且不需要在源代码中明确定义编码。
如果该值设置为
java -Dfile.encoding=iso-8859-1
例如,只能表示 Unicode 字符的子集,因为该字符集仅支持有限数量的字符。其他的将显示为?
。
还有两件事要记住:
接收流的设备(终端、外壳等)必须正确解码。以 GNOME 的终端为例,您可以在菜单中设置字符编码。
该终端等使用的字体必须包含该字符的图形表示