Python'\u2029'是XML不兼容的Unicode吗?

2024-04-25 17:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python3.6.4和lxml4.1.1。在读取/解析etree时,我对12个Unicode分隔符进行了转义。PSEP如下所示:

line = line.replace('\u2029', ' %(#u2029)s '

经过大量筛选/处理后,我将行保存到一个新的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?我该如何逃脱它?你知道吗

谢谢


Tags: ortextinsrclineunicodexmllxml
1条回答
网友
1楼 · 发布于 2024-04-25 17:26:24

在Unicode-In-XML和其他标记语言文档中,有一个部分叫做Characters not Suitable for Use in Markup。本节实际上并没有规定U+2029在XML中是非法的,但它表示不鼓励使用它。你知道吗

阅读整个章节了解详细信息,但简短版本如下:

如果您实际使用它作为段落分隔符,那么应该为您的特定XML语言使用段落分隔符。文档中的示例是XHTML的<xhtml:br /><xhtml:p></xhtml:p>。你知道吗

如果您只是将它作为非XML文本中间的一个字符来使用,而您正将它塞进XML文档中的一个字段中,那么您将需要对它进行转义。怎样?好吧,如果您同时编写创建代码和消费代码,您可以根据需要对其进行转义,只要您可以在另一端取消转义即可。如果其他人正在编写消费代码,您必须生成他们所期望的任何代码。如果消费代码是通用的(比如在Firefox中显示原始XML),那么您希望它是最终用户可读的。你知道吗

对于最后一种情况,实际上,您可能只想使用U+2029,尽管它被“劝阻”。但看起来lxml不会让你这么做,因为它比必要的更严格。这并不是太不合理(你知道,严格控制你生产的东西,自由控制你消费的东西等等),但是如果你有一个恼人的用例,它仍然恼人。在这种情况下,您需要找到一种方法来覆盖它在没有配置设置的情况下所做的操作,比如在lxml中一直对其进行编码,然后在lxml完成后,在将其写入文件/套接字/任何内容之前对其进行转换。你知道吗

相关问题 更多 >