无法加入字符串

时间:2017-05-24 11:57:59

标签: python unicode

在应用程序中,我从另一个进程获取字典。这本词典有一些非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': ''}。真的是这样吗?

0 个答案:

没有答案