Python '\u2029' 是 XML 不兼容的 Unicode 吗?
Is Python '\u2029' an XML incompatible Unicode?
我正在使用 Python 3.6.4 和 lxml 4.1.1。当 reading/parsing etree 时,我转义了 12 个 Unicode 分隔符。 PSEP 看起来像这样:
line = line.replace('\u2029', ' %(#u2029)s '
经过大量 filtering/processing,我使用以下代码将该行保存到一个新的 XML 文件中:
seg = etree.SubElement(tuv, 'seg')
seg.text = line.replace('%(#u2029)s', '\u2029')
产生以下回溯:
Traceback (most recent call last):
File "C:\process-tmx\", line 267, in run
seg.text = line.replace('%(#u2029)s', '\u2029')
File "src\lxml\xtree.pyx", line 1033, in lxml.etree._Element.text.__set__ (src\lxml\etree.c:55075)
File "src\lxml\apihelpers.pxi", line 716, in lxml.etree._setNodeText (src\lxml\etree.c:25862)
File "src\lxml\apihelpers.pxi", line 704, in lxml.etree._createTextNode (src\lxml\etree.c:25725)
File "src\lxml\apihelpers.pxi", line 1444, in lxml.etree._utf8(src\lxml\etree.c:32944)
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
这是否意味着“\u2029”是 XML 不兼容的 Unicode?我如何 XML 逃脱它?
谢谢
在 XML 中的 Unicode 和其他标记语言文档中,有一个名为 Characters not Suitable for Use in Markup 的部分。本节实际上并未强制要求 U+2029 在 XML 中是非法的,但它表示不鼓励使用它。
阅读整个部分以了解详细信息,但简短版本是这样的:
如果您实际将其用作段落分隔符,则应改用您的特定 XML 语言的段落分隔符。文档中的示例对于 XHTML 是 <xhtml:br />
或 <xhtml:p></xhtml:p>
。
如果您只是将它用作一些 non-XML 文本中间的字符,而您正在将其塞入 XML 文档的字段中,您将需要对它进行转义。如何?好吧,如果您正在编写创建代码和使用代码,您可以随心所欲地转义它,只要您可以在另一端取消转义它。如果其他人正在编写消费代码,那么您必须生成他们期望的任何内容。如果消费代码将是 general-purpose(如在 Firefox 中显示原始 XML),那么您将希望它是 end-user.
可读的代码
对于最后一种情况,实际上您可能只想使用 U+2029,尽管它是 "discouraged"。但看起来 lxml
不会让你这样做,因为它比必要的更严格。这并不太不合理(你知道,strict-in-what-you-produce-liberal-in-what-you-consume 等等),但如果你有一个令人讨厌的用例,它仍然很烦人。在这种情况下,你需要找到一种方法来覆盖它所做的事情——如果没有配置设置,比如让它一直编码到 lxml
,然后在 lxml
完成后转换它,就在你把它写到 file/socket/whatever.
之前
我正在使用 Python 3.6.4 和 lxml 4.1.1。当 reading/parsing etree 时,我转义了 12 个 Unicode 分隔符。 PSEP 看起来像这样:
line = line.replace('\u2029', ' %(#u2029)s '
经过大量 filtering/processing,我使用以下代码将该行保存到一个新的 XML 文件中:
seg = etree.SubElement(tuv, 'seg')
seg.text = line.replace('%(#u2029)s', '\u2029')
产生以下回溯:
Traceback (most recent call last):
File "C:\process-tmx\", line 267, in run
seg.text = line.replace('%(#u2029)s', '\u2029')
File "src\lxml\xtree.pyx", line 1033, in lxml.etree._Element.text.__set__ (src\lxml\etree.c:55075)
File "src\lxml\apihelpers.pxi", line 716, in lxml.etree._setNodeText (src\lxml\etree.c:25862)
File "src\lxml\apihelpers.pxi", line 704, in lxml.etree._createTextNode (src\lxml\etree.c:25725)
File "src\lxml\apihelpers.pxi", line 1444, in lxml.etree._utf8(src\lxml\etree.c:32944)
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
这是否意味着“\u2029”是 XML 不兼容的 Unicode?我如何 XML 逃脱它?
谢谢
在 XML 中的 Unicode 和其他标记语言文档中,有一个名为 Characters not Suitable for Use in Markup 的部分。本节实际上并未强制要求 U+2029 在 XML 中是非法的,但它表示不鼓励使用它。
阅读整个部分以了解详细信息,但简短版本是这样的:
如果您实际将其用作段落分隔符,则应改用您的特定 XML 语言的段落分隔符。文档中的示例对于 XHTML 是 <xhtml:br />
或 <xhtml:p></xhtml:p>
。
如果您只是将它用作一些 non-XML 文本中间的字符,而您正在将其塞入 XML 文档的字段中,您将需要对它进行转义。如何?好吧,如果您正在编写创建代码和使用代码,您可以随心所欲地转义它,只要您可以在另一端取消转义它。如果其他人正在编写消费代码,那么您必须生成他们期望的任何内容。如果消费代码将是 general-purpose(如在 Firefox 中显示原始 XML),那么您将希望它是 end-user.
可读的代码对于最后一种情况,实际上您可能只想使用 U+2029,尽管它是 "discouraged"。但看起来 lxml
不会让你这样做,因为它比必要的更严格。这并不太不合理(你知道,strict-in-what-you-produce-liberal-in-what-you-consume 等等),但如果你有一个令人讨厌的用例,它仍然很烦人。在这种情况下,你需要找到一种方法来覆盖它所做的事情——如果没有配置设置,比如让它一直编码到 lxml
,然后在 lxml
完成后转换它,就在你把它写到 file/socket/whatever.