如何转换代理对字符?

时间:2017-10-13 09:45:59

标签: java utf-8 character-encoding

我有一个Web服务,它以XML String作为输入,主要使用UTF-8。但是,代理对可能会混合到字符串中,并且当我的应用程序处理代理对时,这些特定字符变得不可读。

我正在读一个像这样的xml文件(我觉得这部分搞砸了):

String xmlFile = new String(Files.readAllBytes(Paths.get("test.xml")),"UTF-8");

我知道当我遍历字符串中的每个字符时,我可以检测到这一点:

Character.isSurrogatePair(high, low)

我想知道的是,是否有办法将代理对转换为可以在UTF-8中正确识别的东西。例如,“”在UTF-8中是可识别的,因为它有3个字节但“”有4个字节(代理对)但图形显示是相同的。

1 个答案:

答案 0 :(得分:1)

您的代码100%正常(如果编码确实是UTF-8)。 代理对是一种UTF-16将Unicode代码点编码为两个char s(2x2字节)的方式。 UTF-8将其作为更长的多字节序列(2017年最多6个字节)。

Unicode本身只是数字代码点(符号)。然后用UTF- nn 对这些数字进行编码,这样就不会发生错误,例如搜索/的字节并错误地找到它。 UTF-8使用高位,UTf-16使用“代理对”做类似的技巧。 Unicode& UTF是一个坚实的设计。

现在Unicode确实随着时间的推移而增长,标准也在不断扩大。

因此,使用java 6运行时,您可能没有与更高版本相同的Unicode功率(范围)。同样,旧的非java程序和字体也可能有白点。

数据中很可能有些东西是可疑的。读取字节块并将每个块转换为String将导致块边界处的无效字符。