为什么expat拒绝en短划线字符为无效?
在我的XML输入文件,我有以下行:为什么expat拒绝en短划线字符为无效?
<change beforeWhat="Literacy rate in L2: 50\%–75\%. Informally used" />
50\%
和75\%
之间的字符是不是一个连字符,但一个en dash。
当我使用Python中外籍人士在此XML文件解析:
postFixesDoc = minidom.parse('postFixes.xml')
我收到以下错误:
ExpatError: not well-formed (invalid token): line 35, column 99
,其中35是我从XML输入文件上面引述的线, 99是在短划线之前的%
的列。
如果我用–
替换破折号,那么错误消失,一切正常。 所以我有一个解决方法。但我不明白为什么会发生这种情况。
我读过的关于这个问题的内容 - 例如, 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中的错误吗?
啊哈...
This Python doc footnote,虽然它适用于不同的情况,提醒我的事实,我的XML编码声明是错误的:
The encoding string included in XML output should conform to the appropriate standards. For example, “UTF-8” is valid, but “UTF8” is not.
出于某种原因,我的印象utf8
也是可以接受的。但是当我将声明更改为
<?xml version="1.0" encoding="utf-8"?>
错误消失了!
很高兴修复了编码帮助!通常,编码问题的一个有用技巧是将所有非ASCII字符转换为数字字符引用(如“&#x2013;”您尝试过)。如果解决了这个问题,那么问题几乎肯定是在编码级别,在这一点上,你开始计算你的数据是否真的在UCS-2,UTF-8,CP1252中(CP1252是一个卷曲引号和em/en的常见问题破折号,虽然幸福,你没有被那一个咬伤)。
* nix“iconv”实用程序可以在字符编码之间进行转换。如果你要求它将你的数据从utf8转换成ucs2,它会对任何无效的字节序列进行尖叫。
XML增加了一个复杂性:严格禁止许多控制字符(d00 - d31,CR,LF和HT以外)。但是一个值得它的盐的XML解析器会告诉你它是否看到这些。