Unicode latin1字符串编码/解码

cou*_*lix 3 python utf-8 character-encoding

而从一个未知的/旧的/非一致Mysql数据库中获取数据,以使用Python(Django的)ORM一个Postgres UTF-8分贝我有时故障编码的数据作为结果.

目标:grégory

> a
u'gr\xe3\xa9gory'

> print a
grã©gory
Run Code Online (Sandbox Code Playgroud)

我尝试了几种解码/编码技巧但没有成功:

 > print a.encode('utf-8').decode('latin1')
 grã©gory

 > print a.encode('utf-8').decode('latin1')
 grã©gory

 > print a.decode('latin-1')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

即使有一些unicode_escape

Jan*_*ila 7

我猜这个字符串在某个时候被错误地转换为小写,\xc3改为\xe3.当小写转换实际上是utf-8时,它假设了latin1编码.

>>> print 'gr\xc3\xa9gory'.decode('utf8')
grégory
Run Code Online (Sandbox Code Playgroud)

  • @coulix:那是一个至关重要的细节; 为什么在修复之前小写破损数据呢? (2认同)