在我的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是恰好在短划线之前的%
的列。
如果我用–
替换短划线,则错误消失,一切正常。
所以我有一个解决方法。但我不明白为什么会这样。
我读到的有关此问题的内容 - 例如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中的错误吗?
答案 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解析器会告诉你它是否会看到它们。