Python utf-8重音问题

时间:2011-08-06 17:06:41

标签: python diacritics

我的口音有些问题。

我做了一个python脚本,从某些输入(IMAP fetch)获得“refeição ”这个词,这个词用葡萄牙语,我需要把它转换成人类可读的。解码后,它应该显示为“refeição”,但我没有得到这个结果......

>>> print a 
refeição
>>> ENCODING = locale.getpreferredencoding()
>>> print ENCODING
UTF-8
>>> print a.encode(ENCODING)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)
>>> a.decode('utf-8')
u'refei\xe7\xe3o'
>>> print a.decode('utf-8')
refeição

更新:

root@ticuna:/etc/scripts# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

此外,这些单词被插入到mysql数据库中,“不可读”字符的显示方式与终端中的相同。 表格排序是utf8_general_ci

2 个答案:

答案 0 :(得分:2)

看起来您的终端窗口在单字节ISO-8859-1字符集中显示文本(“latin-1”),但您的python解释器认为终端正在说UTF-8 。我们可以从u'refei\xe7\xe3o'看到Python具有正确的内部表示的葡萄牙语字母。显然,print命令然后将内部表示转换为UTF-8并将其发送到终端,当终端将UTF-8解释为ISO-8859-1时,终端会产生乱码。

修复方法是让您的语言环境与终端正在进行的操作相匹配 - 通过更改语言环境或确保终端是utf-8。

答案 1 :(得分:0)

作为解决方法,我正在删除所有重音。

以下是我使用的代码:

def remove_accents(s):
   return ''.join((c for c in unicodedata.normalize('NFD', s.decode('utf-8')) if unicodedata.category(c) != 'Mn'))

根据这个答案: What is the best way to remove accents in a Python unicode string?