解码时出现unicode错误

时间:2015-10-26 13:19:51

标签: python django unicode byte

我使用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作为Ä?

2 个答案:

答案 0 :(得分:2)

我相信您需要一个不同的编码集,例如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

答案 1 :(得分:0)

感谢您的帮助,我使用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

你知道我怎么解决这个问题吗?