Java 如何转换代理项对字符?

Java 如何转换代理项对字符?,java,utf-8,character-encoding,Java,Utf 8,Character Encoding,我有一个以XML字符串作为输入的web服务,它主要采用UTF-8格式。但是,代理项对可能会混合到字符串中,当我的应用程序处理该字符串时,这些特定字符将无法读取 我正在读一个xml文件,就像这样,我感觉这部分把事情搞砸了: String xmlFile = new String(Files.readAllBytes(Paths.get("test.xml")),"UTF-8"); 我知道,当我循环遍历字符串中的每个字符时,我可以检测到这一点: Character.isSurrogatePair(

我有一个以XML字符串作为输入的web服务,它主要采用UTF-8格式。但是,代理项对可能会混合到字符串中,当我的应用程序处理该字符串时,这些特定字符将无法读取

我正在读一个xml文件,就像这样,我感觉这部分把事情搞砸了:

String xmlFile = new String(Files.readAllBytes(Paths.get("test.xml")),"UTF-8");
我知道,当我循环遍历字符串中的每个字符时,我可以检测到这一点:

Character.isSurrogatePair(high, low)
我想知道的是,是否有一种方法可以将代理项对转换为可以在UTF-8中正确识别的内容。例如 在UTF-8中是可以识别的,因为它有3个字节,但是如果编码确实是UTF-8,那么您的代码是100%良好的。代理项对是UTF-16将Unicode代码点编码为两个字符2x2字节的一种方式。2017年,UTF-8将其作为一个更长的多字节序列(最多6个字节)覆盖

Unicode本身只是对代码点和符号进行编号。然后用UTF nn对这些数字进行编码,这样就不会发生错误,例如在字节中搜索/并错误地找到它。UTF-8使用高位,UTF-16使用代理项对执行类似的操作。Unicode和UTF是一种可靠的设计

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

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


数据中很可能有可疑之处。读取字节块并将每个块转换为字符串将导致块边界处出现无效字符。

您是否仅尝试使用Files.readAllBytesPath.gettest.xmlYes,我还尝试将整个xml字符串粘贴到java类中并在测试中运行。这些字符在eclipse中显示得很好,但在运行时分配给字符串变量时,它会变成不同的字符。字符串、字符和字符使用UTF-16。UTF-8和UTF-16都可以对整个Unicode字符集进行编码。没问题。那么他们的文件可能有点可疑,就像下面评论的那个人,我会看一下,稍后更新。