为什么expat拒绝短划线字符无效?

时间:2013-12-11 17:57:34

标签: xml encoding utf-8 expat-parser

在我的XML输入文件中,我有以下一行:

<change beforeWhat="Literacy rate in L2: 50\%–75\%. Informally used" />

50\%75\%之间的字符不是连字符,而是en dash

当我在Python中使用expat解析此XML文件时:

postFixesDoc = minidom.parse('postFixes.xml')

我收到以下错误:

ExpatError: not well-formed (invalid token): line 35, column 99             

其中35是我在XML输入文件中引用的行,而99是恰好在短划线之前的%的列。

如果我用&#x2013;替换短划线,则错误消失,一切正常。 所以我有一个解决方法。但我不明白为什么会这样。

我读到的有关此问题的内容 - 例如Python’s minidom, xml, and illegal unicode characters - 告诉我一些在UTF-8中合法的字符在XML中是不合法的,并且在法律字符范围内指向section 2.2 of the XML Spec。但Char的定义包括范围#x20-#xD7FF。并且#x2013显然属于该范围。那有什么问题?

FWIW,XML输入文件以UTF-8声明开头,

<?xml version="1.0" encoding="utf8"?>

并且我使用十六进制编辑器来验证短划线由字符序列E2 80 93表示,这是用于短划线的correct UTF-8 encoding。那么为什么不会外籍人士接受呢?这是expat中的错误吗?

2 个答案:

答案 0 :(得分:5)

...阿哈

This Python doc footnote虽然它适用于不同的情况,但提醒我注意我的XML编码声明是错误的:

  

XML输出中包含的编码字符串应符合   适当的标准。例如,“UTF-8”有效,但“UTF8”有效   不

出于某种原因,我认为utf8也是可以接受的。但是当我将声明改为

<?xml version="1.0" encoding="utf-8"?>

错误消失了!

答案 1 :(得分:1)

很高兴修复编码有帮助!通常,编码问题的一个有用技巧是将所有非ASCII字符转换为数字字符引用(例如“&amp;#x2013;”您尝试过)。如果它修复它,那么问题几乎肯定是在编码级别,此时你开始计算你的数据是否真的在UCS-2,UTF-8,CP1252(CP1252是卷曲引号和em / en的常见问题破折号,但幸福的是,你没有被那个人咬伤。)

* nix“iconv”实用程序可以在数以万计的字符编码之间进行转换。如果您要求它将数据从(例如)utf8转换为ucs2,它会尖叫任何无效的字节序列。

XML增加了一个并发症:严格禁止使用许多控制字符(d00-d31,CR,LF和HT除外)。但是一个值得盐的XML解析器会告诉你它是否会看到它们。