【问题标题】:unicode error when decoding解码时出现unicode错误
【发布时间】:2016-01-25 14:45:44
【问题描述】:

我使用 configparser 来读取我喜欢的配置:

file = b'[OWNER]\r\naction=PRODUCT_SENDS_CONFIG\r\nimei=861311003801742\r\nphone_number=0616055459\r\nSN=100004\r\nproduct_name=TACT\r\nproduct_version=01.00\r\n[DATABASE]\r\nstring=\xc4a\xc4a\xc4a\xc4a\r\n'

config = configparser.RawConfigParser(allow_no_value=True)
config.readfp(StringIO(stream.read().decode(encoding='utf-8')))

但是我得到了这个错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 462: invalid continuation byte

你怎么能是解决方案,我不知道在使用configparser之前对文件变量做的处理,我想把\xc4a读成Ä?

【问题讨论】:

    标签: python django unicode byte


    【解决方案1】:

    我相信您可能需要不同的编码集,例如iso-8859-1,否则:

    >>> b"\xc4a\xc4a\xc4a".decode(encoding='utf-8')
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 0: invalid continuation byte ...
    

    让我们尝试改用iso-8859-1

    >>> b"\xc4a\xc4a\xc4a".decode(encoding='iso-8859-1')
    u'\xc4a\xc4a\xc4a'
    ...
    >>> print("\xc4a\xc4a\xc4a".decode(encoding='iso-8859-1'))
    ÄaÄaÄa
    

    看起来iso-8859-1 是正确的编码。

    有时在脚本顶部的特殊注释中添加正在使用的编码对于 Unicode 文字也很有用:

    >>> #!/usr/bin/env python
    ... # -*- coding: latin-1 -*-
    ... 
    >>> u = u'abcdé'
    >>> print ord(u[-1])
    233
    

    https://docs.python.org/2/howto/unicode.html

    【讨论】:

      【解决方案2】:

      感谢帮助,我把ISO格式解决了。

      但是我现在有另一个问题,我必须像之前收到的那样发回十六进制数据:\xc4a\xc4a\xc4a in a string。

      我制作了一个十六进制数据并将其附加到我的配置字符串中,我将字符串的每个字符转换为其十进制值,最后在其上应用十六进制:

      checksum = 0 
      for c in str_config: 
          b = int(hex(ord(c)), 16) 
          checksum += b 
      return str_config+hex(checksum)
      

      但结果显示像这样的十六进制:'0xb2a5' 而不是 \xb2a5

      你知道我该如何解决这个问题吗?

      【讨论】:

        猜你喜欢
        • 2019-04-30
        • 2020-12-21
        • 1970-01-01
        • 2018-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        相关资源
        最近更新 更多