我终于不得不处理 Java 中的代理 UTF 字符了。我在尝试在 Cygwin 启动的 uxterm 上打印它们时遇到问题。
这是一个示例程序。它打算打印数学斜体小 i (代码点 119894):
public class PrintChar {
public static void main(String[] args) throws Exception {
int codepoint = 119894; // Mathematical italic small i
String s = new StringBuilder().appendCodePoint(codepoint).toString();
System.out.println("Codepoint " + codepoint + "=" + s);
}
}
当我运行它时,我得到输出:
$ java -Dfile.encoding=UTF-8 -cp bin PrintChar
Codepoint 119894=?
但是当我通过
cat
管道输出时,我得到了预期的结果:
$ java -Dfile.encoding=UTF-8 -cp bin PrintChar | cat
Codepoint 119894=𝑖
有人可以解释一下为什么吗?常规 cygwin 终端也会发生这种情况。在通过 VMware vSphere 运行的终端中不会发生这种情况。在那个终端上,我不需要管道来看到斜体 i。
在使用编码时,您应该始终记住有两个操作:编码和读取。
我猜猜发生了什么。这 ?您在终端上看到的是 cygwin 如何解码在三字节数组 11、98、94 上编码的 utf-8 字符。?当 cygwin 无法理解您提供的字符时,可能是“小丑”字符。通过使用 cat,cat 可能理解 utf-8 字符,并检测到您的 cygwin 终端未配置为渲染 utf-8,car 正在将字符转换为另一种编码字符集(CP1252 - ISO8859?)。
您可以将 cat 的结果放入一个文件中,对该文件进行十六进制编辑并检查二进制结果。它肯定已经改变了,给这个值你可以尝试找到它是哪种编码。
要解决您的问题,我认为您只需更改 cygwin 的默认字符集即可。