解码时出现unicode错误
unicode error when decoding
我使用 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'编解码器无法解码位置 462 中的字节 0xc4:连续字节无效
您知道解决方案是什么吗,我不知道在使用 configparser 之前对文件变量进行的处理,我想将 \xc4a 读作 Ä?
我相信您可能需要不同的编码集,例如 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
谢谢帮忙,我把ISO格式给解决了。
但是我现在有另一个问题,我必须像以前收到的那样发回十六进制数据:\xc4a\xc4a\xc4a 字符串。
我制作了一个十六进制数据并将其附加到我的配置字符串中,我将字符串的每个字符转换为其十进制值,最后在其上应用了十六进制:
checksum = 0
for c in str_config:
b = int(hex(ord(c)), 16)
checksum += b
return str_config+hex(checksum)
但结果显示的十六进制是这样的:'0xb2a5' 而不是 \xb2a5
你知道我该如何解决这个问题吗?
我使用 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'编解码器无法解码位置 462 中的字节 0xc4:连续字节无效
您知道解决方案是什么吗,我不知道在使用 configparser 之前对文件变量进行的处理,我想将 \xc4a 读作 Ä?
我相信您可能需要不同的编码集,例如 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
谢谢帮忙,我把ISO格式给解决了。
但是我现在有另一个问题,我必须像以前收到的那样发回十六进制数据:\xc4a\xc4a\xc4a 字符串。
我制作了一个十六进制数据并将其附加到我的配置字符串中,我将字符串的每个字符转换为其十进制值,最后在其上应用了十六进制:
checksum = 0
for c in str_config:
b = int(hex(ord(c)), 16)
checksum += b
return str_config+hex(checksum)
但结果显示的十六进制是这样的:'0xb2a5' 而不是 \xb2a5
你知道我该如何解决这个问题吗?