2

メソッドElementTreeを使用してテキストに出力しようとしているインスタンスがあります。tostring

tostring(root, encoding='UTF-8')

ノードの1つにキャラクターがあるため、UnicodeDecodeError(以下のトレースバック)が表示されます。テキスト プロパティを次のように設定します。Element.textu'\u2014'

my_str = u'\u2014'
el.text = my_str.encode('UTF-8')

ツリーをテキストに正常にシリアル化するにはどうすればよいですか? ノードを正しくエンコードしていませんか? ありがとう。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "crisis_app/converters/to_xml.py", line 129, in convert
    return tostring(root, encoding='UTF-8')
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1127, in tostring
    ElementTree(element).write(file, encoding, method=method)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 821, in write
    serialize(write, self._root, encoding, qnames, namespaces)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 940, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 940, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 940, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 938, in _serialize_xml
    write(_escape_cdata(text, encoding))
  File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1074, in _escape_cdata
    return text.encode(encoding, "xmlcharrefreplace")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 288: ordinal not in range(128)
4

1 に答える 1

2

これを行う場合:

my_str = u'\u2014'
el.text = my_str.encode('UTF-8')

テキストを utf-8 でエンコードされたバージョンの Unicode 文字に設定しています。と同じです

el.text = '\xe2\x80\x94'

これで、Unicode 文字はなくなりましたが、一連のバイトです。

次に行う場合:

tostring(root, encoding='UTF-8')

あなたは、コンテンツをutf-8としてエンコードしたいと言っています。そのために、内部的には、最初にデフォルトのエンコーディング (ascii) を使用して文字列を unicode にデコードし、次に utf-8 としてエンコードする必要があります。これはもちろん、文字列内のバイトが ascii の範囲にないため失敗します。

ElementTree は Unicode を完全に扱うことができるので、str の代わりに unicode を与えるだけです:

>>> from xml.etree import ElementTree as et
>>> e = et.Element('test')
>>> e.text = u'\u2014'

>>> s = et.tostring(e)
>>> print s, repr(s)
<test>&#8212;</test> '<test>&#8212;</test>'

>>> s = et.tostring(e, encoding='utf-8')
>>> print s, repr(s)
<test>—&lt;/test> '<test>\xe2\x80\x94</test>'
于 2013-07-10T20:52:35.023 に答える