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

Lar*_*rsH 2 xml encoding utf-8 expat-parser

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

<change beforeWhat="Literacy rate in L2: 50\%–75\%. Informally used" />
Run Code Online (Sandbox Code Playgroud)

50\%和之间的那个字符75\%不是连字符而是短划线.

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

postFixesDoc = minidom.parse('postFixes.xml')
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ExpatError: not well-formed (invalid token): line 35, column 99             
Run Code Online (Sandbox Code Playgroud)

其中35是我在XML输入文件中引用的行,而99是%在en dash之前的右列.

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

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

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

<?xml version="1.0" encoding="utf8"?>
Run Code Online (Sandbox Code Playgroud)

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

Lar*_*rsH 5

啊哈...

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

XML输出中包含的编码字符串应符合相应的标准.例如,"UTF-8"有效,但"UTF8"不有效.

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

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

错误消失了!