在应用程序中,我从另一个进程获取字典。这本词典有一些非ascii字符,如Ä
。
我想从这个字典中生成一个json字符串,但我得到的只是
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 19: ordinal not in range(128)
所以我开始了一个pudb
会话并进入代码,直到我找到引发异常的行。
在我的python版本(2.7.9,anaconda build)JSONEncoder
类,encode
函数。
def encode(self, o):
...
chunks = self.iterencode(o, _one_shot=True)
if not isinstance(chunks, (list, tuple)):
chunks = list(chunks)
return ''.join(chunks)
''.join(chunks)
是产生此问题的原因。在pudb
控制台中,我设法找到产生错误的chunks
中的索引,#355
In [51]: chunks[355]
Out[51]: '"Datum Erfassung / \xc3\x84nderung"'
文字为"Datum Erfassung / Änderung"
。对我而言,这似乎是有效的utf-8代码,this documentation表示对于U + 00E4,utf-8十六进制是0xC3 0x84
。但是如果我做的话
In [53]: u'Ä'
Out[53]: u'\xc4'
为什么我在这里得到0xC4
?
在另一个帖子中有人建议使用str
转换字符串以基本上删除编码。所以我试过
In [54]: ''.join([str(x) for x in chunks])
这次它有效,没有错误。但如果我这样做:
for ch in chunks:
if str(ch) != ch:
print "'%s' differs" % str(ch)
输出仍为空。并且不知道为什么''.join(chunk)
不起作用,''.join([str(x) for x in chunks])
会这样做。
我错过了什么?
btw:chardet.detect(chunks[355])
输出{'confidence': 0.73, 'encoding': 'Windows-1252', 'language': ''}
。真的是这样吗?