我正在尝试使用lxml:
将有效的法语文本字符串分配给文本字符串el = etree.Element("someelement")
el.text = 'Disponible à partir du 1er Octobre'
我收到错误:
ValueError:所有字符串必须兼容XML:Unicode或ASCII,否 NULL字节或控制字符
我也试过了:
el.ext = etree.CDATA('Disponible à partir du 1er Octobre')
但是我得到同样的错误。
如何处理XML中的法语,尤其是ISO-8859-1?有一些方法可以在lxml中的tostring()函数中指定编码,但不能在元素中指定文本值。
答案 0 :(得分:5)
如果您有python版本< 3你可以尝试:
el.text = u'Disponible à partir du 1er Octobre'
答案 1 :(得分:4)
如果文本包含非ascii数据,那么您应该将其作为el.text
的Unicode字符串提供。
正如@Abbasov Alexander's answer所示,您可以使用Unicode文字u''
来完成此操作。 Python没有引发异常,因此我假设您已经声明了Python源文件的字符编码(例如,在顶部使用# coding: utf-8
注释)。此编码定义了Python如何解释源中的非ascii字符,它与用于将xml保存到文件的编码无关。
如果文本已经在变量中并且您尚未将其转换为Unicode,则可以使用text.decode(text_encoding)
(text_encoding
可能与Python源编码无关)。
令人困惑的位可能是el.text
(作为优化)在Python 2上为纯ascii数据返回字节串。它违反了不应混合字节和Unicode字符串的规则。虽然如果sys.getdefaultencoding()
返回基于ascii的编码,它应该可以工作,就像在大多数情况下一样。
要保存xml,请将所需的任何字符编码传递给tostring()
或ElementTree.write()
个函数。同样,这种编码与其他已经提到的编码无关。
通常,使用Unicode sandwich:一旦收到字节就将字节解码为Unicode,在程序中使用Unicode文本,当需要使用不需要的API发送文本时尽可能晚地编码为字节不支持Unicode(文件,网络)。