首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python从字符串中不能解码gbk编码?

python从字符串中不能解码gbk编码?
EN

Stack Overflow用户
提问于 2017-07-30 15:39:15
回答 1查看 401关注 0票数 0

我用“gbk”编码xml:

代码语言:javascript
复制
#!/usr/bin/env python
# encoding: utf-8
from xml.etree.ElementTree import Element, SubElement, tostring, fromstring, XML, XMLParser

root = Element('root')
child = SubElement(root, "child")
child.text = u"中文"

result = tostring(root, encoding="gbk")
print(result)
print(result.decode("gbk"))

这将产生如下结果:

代码语言:javascript
复制
b"<?xml version='1.0' encoding='gbk'?>\n<root><child>\xd6\xd0\xce\xc4</child></root>"

所以,我试图像这样解析xml,我这样做:

代码语言:javascript
复制
tree = XML(result.decode("gbk"))
print(tree[0].text)
tree = XML(result.decode("gbk"), parser=XMLParser(encoding="gbk"))
print(tree[0].text)
tree = XML(result.decode("gbk"), parser=XMLParser(encoding="utf-8"))
print(tree[0].text)

我发现它们都在python 3.6中工作,但是没有一个在python 2.7中工作,python 2.7中的错误是:

代码语言:javascript
复制
UnicodeEncodeError: 'ascii' codec can't encode characters in position 50-51: ordinal not in range(128)

所以,我有两个问题:

  1. 为什么两个XMLParser(encoding="gbk") XMLParser(encoding="utf-8")python3.6中返回相同的结果
  2. 如何使xml解析器在python2.7中正常工作?(我不认为result.decode('gbk').encode('utf8').replace('GBK', 'utf-8')是个好主意。)
EN

回答 1

Stack Overflow用户

发布于 2017-07-30 16:25:08

代码语言:javascript
复制
>>> from xml.etree.ElementTree import Element, SubElement, tostring, XML
>>> root = Element("root")
>>> child = SubElement(root, "child")
>>> child.text = u"中文"
>>> result = tostring(root, encoding="utf-8")  # Return str in Py2, Return bytes in Py3
>>> result
'<root><child>\xe4\xb8\xad\xe6\x96\x87</child></root>'
>>> print type(result)
<type 'str'>  # The type str in Py2 is the type bytes in Py3
>>> print result.deocde("utf-8")
<root><child>中文</child></root>
>>> tree = XML(result)
>>> print tree[0].text
中文

对于第二个问题,以上代码在Python2.7中工作。

更新

我想您的目的是从gbk编码的字符串构造XML。您可以在lxml中使用Python2,也可以直接使用Python3。

代码语言:javascript
复制
>>> from lxml import etree
>>> root = etree.Element("root")
>>> child = etree.SubElement(root, "child")
>>> child.text = u"中文"
>>> result = etree.tostring(root, encoding="gbk")
>>> result
"<?xml version='1.0' encoding='gbk'?>\n<root><child>\xd6\xd0\xce\xc4</child></root>"
>>> tree = etree.XML(result)
>>> tree[0].text
u'\u4e2d\u6587'
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45401596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档