对包含U + 001A的XML文档进行编码

时间:2011-12-08 03:24:47

标签: xml unicode

我有一个XML文档,它是从人们从各种地方复制/粘贴的一些内容生成的(但大多数是Word文档)。

看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <data> <![CDATA[
         (whatever was pasted)
    ]]></data>        
</response>

我一直使用UTF-8iso-8859-1的编码,但现在有人已经离开并复制/粘贴了unicode字符U+001A({{1}我无法找到接受它的编码。我把XML文件放入的所有内容(例如Firefox,Internet Explorer,XML Spy)都说它无效,无论使用何种编码。

我可以使用哪种编码来阻止文件翻倒,还是我需要逐个开始剥离所有这些字符?

3 个答案:

答案 0 :(得分:6)

U + 001A不是XML文档中的有效字符。根据{{​​3}}的有效字符范围是:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

答案 1 :(得分:3)

字符U + 001A位于C0控件区域,大部分(包括U + 001A)在XML中被禁止。任何人都故意进入它是不可能的。相反,它是由软件生成的,可能在执行字符代码转换和检测格式错误的数据时(例如,在源编码中没有定义含义的字节)。 U + 001A(SUBSTITUTE)字符适用于此类用途;见我的quick reference to C0 Controls

如果您无法追踪并修复产生U + 001A的转换(或其他过程),我建议您用U + FFFD REPLACEMENT CHARACTER替换它。它在某种意义上是U + 001A的Unicode等价物。 (后者当然也是Unicode,但在许多情况下都不允许。)但它有一个可见的字形,尽管字形只存在于少数字体中;查看fileformat.info entry on U+FFFD了解详情。

这里的要点是将U + 001A更改为U + FFFD会使数据在XML中可接受,并且仍然保留有关字符级数据错误的信息。

答案 2 :(得分:1)

预处理原始数据,自己编码XML文档不支持的Unicode字符。例如,使用HTML字符编码:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <data> <![CDATA[This is &#x1a; a test.]]></data>        
</response>

在重新读回时,您必须对数据进行后处理,以将HTML编码转换回正确的Unicode字符。