2

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

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

50\%和之间的那个字符75\%不是连字符而是破折号

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

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

我收到以下错误:

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

其中 35 是我在上面从 XML 输入文件中引用的行,而 99 是%右破折号之前的列。

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

我读到的关于这个问题的内容——例如Python 的 minidom、xml 和非法 unicode 字符——告诉我一些在 UTF-8 中合法的字符在 XML 中是不合法的,并指出我的第 2.2 节 XML规范合法字符范围。但是 Char 的定义包括 range #x20-#xD7FF。并且#x2013显然属于这个范围。所以有什么问题?

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

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

我使用十六进制编辑器验证短划线是否由字符序列 E2 80 93 表示,这是短划线的正确 UTF-8 编码。那么为什么外国人不接受呢?这是外籍人士的错误吗?

4

2 回答 2

5

啊哈...

这个 Python 文档脚注虽然适用于不同的情况,但提醒我我的 XML 编码声明是错误的:

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

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

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

错误消失了!

于 2013-12-11T17:57:34.253 回答
1

很高兴修复编码有帮助!通常,编码问题的一个有用技巧是将所有非 ASCII 字符转换为数字字符引用(如您尝试过的“–”)。如果这样可以解决问题,那么几乎可以肯定问题出在编码级别,此时您开始确定您的数据是否真的是 UCS-2、UTF-8、CP1252(CP1252 是弯引号和 em/en 的常见问题破折号,虽然很高兴,但你没有被那个咬伤)。

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

XML 又增加了一项复杂性:严格不允许使用许多控制字符(d00 - d31,CR、LF 和 HT 除外)。但是一个称职的 XML 解析器会告诉你它是否看到了这些。

于 2013-12-11T18:26:07.247 回答