xml - 为什么外籍人士拒绝破折号字符无效?

标签 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 是破折号之前 % 的列。

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

我读到的关于这个问题的内容——例如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对于破折号。那么为什么外籍人士不接受呢?这是外籍人士的错误吗?

最佳答案

啊哈...

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"?>

错误消失了!

关于xml - 为什么外籍人士拒绝破折号字符无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20526523/

相关文章:

java - 是否可以从 XSLT 样式表中实例化 Java 表单?

xml - 将属性值指定为 CDATA

python - lxml:从 HTML 中提取 unicode 文本

javascript - ActionScript2 Base64 编码/解码二进制数据

javascript - 未找到 HTML 文档的字符编码声明

java - 将包含 ISO 8859-1 十六进制字符代码的字符串转换为 UTF-8 java

c# - 如何使用 XmlSerializer 序列化内部类?

java - XML 解析 - DOM 或 SAX - 以属性作为访问 java 层次结构的条件的复杂 xml

用于流的 Java 缓冲 base64 编码器

linux - 如何为 Yocto 构建添加多语言支持?