UnicodeDecodeError:'utf8'编解码器无法解码字典

时间:2016-01-29 13:51:08

标签: python json python-2.7 dictionary

这里已经有类似的问题了。在我看来,下面的问题是不同的,因为我有一本字典而不是字符串。

所以,我有一个词典:result_dict。此词典中的某些值可能包含ü,ä,ß等。

当我尝试使用:

转储此dict时
result_dict_dumped = json.dumps(result_dict)

我收到此错误消息:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xfc in position 9: invalid start byte

有没有机会解决这个问题而不将字典中的每个值都编码并对其进行编码?

这是一个小例子字典:

{
    'POSSIBLE_DATACENTER': 'tt@4', 
    'CPU_COUNT': None, 
    'DESCRIPTION': 'Test-DC f\xfcr tbc'
}

f\xfcr实际上是für

3 个答案:

答案 0 :(得分:4)

JSON是一种基于文本的格式,不能用于表示任意字节序列。您的dict数据使用什么编码 - 字节0xfc不是有效的1字节utf-8字符。

在您尝试对其进行json编码之前,您可能需要解码dict的内容(来自当前存储的任何编码)。

编辑:您的dict数据编码可能是以下任何编码:

>>> x = b"\xfc"
>>> print x.decode("latin-1")
ü
>>> print x.decode("cp1252")
ü

>>> json.dumps(x.decode("latin-1"))
'"\\u00fc"'

你调用也告诉json编码器字符串与utf-8的编码不同 - 这可能是你想要做的,只要你的dict中的每个str都在这个编码中:

>>> json.dumps(b"\xfc", encoding="latin-1")
'"\\u00fc"'

答案 1 :(得分:1)

听起来你正在运行python2 - 你需要使用解码方法......

小例子 - 抱歉使用你的信件......

import pprint
gstr_in_bytes=bytearray(b'ü'+b'ä'+b'ß')
type(gstr_in_bytes)

print("Data looks like this")
pprint.pprint(gstr_in_bytes)
print("String in utf8 is %s"%gstr_in_bytes.decode('utf-8'))

你应该看到

Data looks like this
bytearray(b'\xc3\xbc\xc3\xa4\xc3\x9f')
String in utf8 is üäß

答案 2 :(得分:1)

Tom已经回答了您的问题,但您可能会发现此代码的输出很有趣。请注意,我的终端配置为使用UTF-8编码。

import json

d = {
    'POSSIBLE_DATACENTER': 'tt@4', 
    'CPU_COUNT': None, 
    'DESCRIPTION': 'Test-DC f\xfcr tbc'
}

def show_dict(d):
    for k, v in d.iteritems():
        print k, v

print '*** Original ***'
show_dict(d)

print '\n*** Decoded from latin1 ***'
s = json.dumps(d, encoding='latin1', indent=4)
print s

newd = json.loads(s)
print '\n*** Reloaded ***'
show_dict(newd)

print '\n*** new dump ***'
print json.dumps(newd, indent=4)

<强>输出

*** Original ***
POSSIBLE_DATACENTER tt@4
CPU_COUNT None
DESCRIPTION Test-DC f�r tbc

*** Decoded from latin1 ***
{
    "POSSIBLE_DATACENTER": "tt@4", 
    "CPU_COUNT": null, 
    "DESCRIPTION": "Test-DC f\u00fcr tbc"
}

*** Reloaded ***
POSSIBLE_DATACENTER tt@4
CPU_COUNT None
DESCRIPTION Test-DC für tbc

*** new dump ***
{
    "POSSIBLE_DATACENTER": "tt@4", 
    "CPU_COUNT": null, 
    "DESCRIPTION": "Test-DC f\u00fcr tbc"
}

您可能会发现这篇文章很有用:Pragmatic Unicode,由SO资深人士Ned Batchelder撰写。