【问题标题】:Python UTF-8 Encoding IssuePython UTF-8 编码问题
【发布时间】:2017-01-18 19:49:28
【问题描述】:

在从网站解析 xml 的过程中,我设法迷失在一堆 utf-8 编码问题中。具体来说,我的字符串看起来像:

u'PA_g\xc3\xa9p7'

当我打印这个时,我得到:

>> PA_gép7

我想要的反而来自以下

print('PA_g\xc3\xa9p7')
>> PA_gép7

这是我的代码:

def get_api_xml_response(base_url, query_str):
"""gets xml from api @ base_url using query_str"""
  res = requests.get(u'{}{}'.format(base_url, query_str))
  xmlstring = clean_up_xml(res.content).encode(u'utf-8')
  return ET.XML(xmlstring)

我的函数 clean_up_xml 用于删除导致我出现问题的命名空间和其他字符。

def clean_up_xml(xml_string):
"""remove the namespace and invalid chars from an xml-string"""
   return re.sub(' xmlns="[^"]+"', '', xml_string, count=1).replace('&', '&')

【问题讨论】:

    标签: python xml string unicode encoding


    【解决方案1】:

    您从res.content 获取一个以/最可能/ UTF-8 编码的二进制字符串,并再次将其编码为UTF-8。二进制字符串只能是decode()'d,Unicode 字符串只能是encode()'d,除了一些special cases

    由于clean_up_xml() 适用于二进制字符串,最好将二进制输入传递给 ElementTree,它会正确处理:

    xmlstring = clean_up_xml(res.content)
    # let ElementTree decode content using information from the XML itself
    # e.g. <?xml version="1.0" encoding="UTF-8"?>
    return ET.XML(xmlstring)
    

    如果您决定重构代码以使用 unicode,则应尽快解码所有二进制输入:

    # let requests decode response using information from HTTP header
    # e.g. Content-Type: text/xml; charset=utf-16
    xmlstring = clean_up_xml(res.text)
    return ET.XML(xmlstring)
    

    在询问与 Unicode 相关的问题时,指定 Python 版本很重要,在这种情况下,Python 2 和 print_function 是从未来导入的。在 Python 3 中,您会看到以下内容:

    >>> print('PA_g\xc3\xa9p7')
    PA_gép7
    >>> 'PA_g\xc3\xa9p7' == u'PA_g\xc3\xa9p7'
    True
    

    【讨论】:

    • 非常感谢您的回答!你是对的,我在不应该在的地方编码!
    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 2018-02-18
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多