不可打印的python unicode字符串

不可打印的python unicode字符串,python,unicode,string-conversion,mojibake,Python,Unicode,String Conversion,Mojibake,我从图像中检索到一些exif信息,并获得以下信息: { ... 37510: u'D2\nArbeitsamt\n\xc3\x84nderungsbescheid' ...} 我原以为是这样的 { ... 37510: u'D2\nArbeitsamt\nÄnderungsbescheid' ... } 我需要将该值转换为str,但无法使其正常工作。我总是得到这样的东西(使用python27) 你知道我该怎么处理吗 更新: 我用python3试过了,现在抛出了错误,但结果是现在 { ...

我从图像中检索到一些exif信息,并获得以下信息:

{ ...
37510: u'D2\nArbeitsamt\n\xc3\x84nderungsbescheid'
...}
我原以为是这样的

{ ...
37510: u'D2\nArbeitsamt\nÄnderungsbescheid'
... }
我需要将该值转换为str,但无法使其正常工作。我总是得到这样的东西(使用python27)

你知道我该怎么处理吗

更新:

我用python3试过了,现在抛出了错误,但结果是现在

{ ...
37510: 'D2\nArbeitsamt\nÃ\x84nderungsbescheid',
... }

这仍然不是预期的。

似乎是utf8被错误地解码为latin1,然后放入unicode字符串中。您可以使用
.encode('iso8859-1')
来反转错误的解码

>>> my_dictionary = {37510: u'D2\nArbeitsamt\n\xc3\x84nderungsbescheid'}
>>> print(my_dictionary[37510].encode('iso8859-1'))
D2
Arbeitsamt
Änderungsbescheid
您现在可以很好地打印出来,但也可以将其解码为unicode,这样它就可以得到正确的类型以供进一步处理:

>>> type(my_dictionary[37510].encode('iso8859-1'))
<type 'str'>
>>> print(my_dictionary[37510].encode('iso8859-1').decode('utf8'))
D2
Arbeitsamt
Änderungsbescheid
>>> type(my_dictionary[37510].encode('iso8859-1').decode('utf8'))
<type 'unicode'>
>>类型(我的字典[37510]。编码('iso8859-1'))
>>>打印(我的字典[37510]。编码('iso8859-1')。解码('utf8'))
D2
劳动局
Äunderungsbeschide
>>>键入(我的字典[37510]。编码('iso8859-1')。解码('utf8'))

Python2还是Python3?感觉就像我在看Python2代码,所以我会去做。你要做的是
x[37510]。编码('UTF-8')
x[37510]。解码('UTF-8')
,我永远记不清是哪种方式。就试图解释字符串而言,默认编码是ASCII表,而不是猜测字符串的编码方式。开发人员需要为语言做这件事,而不是为您做这件事。您使用的是python2吗?它的python2,@torx尝试了两种变体,但都没有成功。我甚至不知道该怪什么。。。是Python2的unicode处理了这个问题,还是EXIF库在一开始就产生了那个数据?我使用PIL作为EXIF阅读器,我很确定这是好的。可能是exif数据(gthumb)的创建者使用了utf8以外的另一种编码吗?如果您输入的文本编码不正确或未知,那么有一个名为python的库,它可以很好地修复大多数典型的编码混淆。它对于解析exif中嵌入的文本数据非常有用,因为其他程序可能会将字符串编码为utf8而不是latin1(8859-1)。顺便说一下,这不是latin1(iso 8859-1)。似乎是utf8被错误地解码为latin1
.encode('iso8859-1')
反转错误的解码。我不确定
print()
是否总能正确使用utf8编码。我怀疑这取决于系统区域设置。这是python 2和python 3之间发生了很大变化的地方。谢谢你,我改进了答案。
>>> type(my_dictionary[37510].encode('iso8859-1'))
<type 'str'>
>>> print(my_dictionary[37510].encode('iso8859-1').decode('utf8'))
D2
Arbeitsamt
Änderungsbescheid
>>> type(my_dictionary[37510].encode('iso8859-1').decode('utf8'))
<type 'unicode'>