Python utf-8 重音问题

0 投票
2 回答
4380 浏览
提问于 2025-04-16 23:02

我在处理带重音符号的文字时遇到了一些问题。

我写了一个Python脚本,从一些输入(IMAP获取)中提取出单词"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 个回答

2

看起来你的终端窗口显示的文字是单字节的ISO-8859-1编码,也就是“latin-1”,但是你的Python解释器却“认为”终端使用的是UTF-8编码。从u'refei\xe7\xe3o'这段代码可以看出,Python内部对葡萄牙字母的表示是正确的。问题在于,打印命令把这种内部表示转换成UTF-8格式,然后发送到你的终端,而终端把这个UTF-8当成ISO-8859-1来解读,结果就出现了乱码。

解决办法是让你的区域设置(locale)和终端的设置一致——要么改变区域设置,要么确保你的终端使用的是UTF-8编码。

0

作为一种解决方法,我正在去掉所有的重音符号。

这是我使用的代码:

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

这个方法是基于这个回答: 在Python的unicode字符串中,去掉重音符号的最佳方法是什么?

撰写回答