使用libxml2解析xml时处理Surrogate对

时间:2014-04-23 08:57:12

标签: xml parsing xml-parsing libxml2

我正在尝试使用libxml2解析xml。但是,有时我会在其中获得代理对的代码点,这些代码对超出了http://www.w3.org/TR/REC-xml/#NT-Char中指定的范围 因此,我的libxml2解析器无法解析它,因此我收到错误。有人可以告诉我如何在使用libxml2解析XML时处理代理对。

我要解析的一个示例xml是:

<?xml version="1.0" encoding="UTF-8"?>
<message><body>  &#xD83D;&#xD83D;</body></message>

2 个答案:

答案 0 :(得分:3)

请注意,xD83D是一个高代理人。代理对包括高代理和低代理;两个高代理人彼此相邻并不是一个“替代对”,这是无稽之谈。

另请注意,在XML中表示非BMP字符的正确方法是组合字符的单个字符引用,例如&#x120AB;。在某些字符编码中需要将非BMP字符拆分为两个代理项,但在XML字符引用中不需要(或允许)它。 XML中的字符引用表示Unicode代码点,而不是特定于特定字符编码的数值。

如果您无法修复创建此错误XML的程序,那么最好的方法是使用脚本修复它,例如在Perl中查找无效的字符引用对,并用正确的XML表示替换它们。

答案 1 :(得分:0)

如果XML标准不允许这些字符,则解析器将抛出错误。在xml中包含这些字符的一种方法是将它们放在CDATA段中。它们用于转义包含字符的文本块,否则这些字符将被识别为标记。

<message><body>  <![CDATA[&#xD83D;&#xD83D;&#xD83D;]]></body></message>

上面的xml将被正确解析。