【问题标题】:Python utf-8 accents problemPython utf-8 重音问题
【发布时间】:2011-08-06 17:06:41
【问题描述】:

我在口音方面遇到了一些问题。

我做了一个 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

【问题讨论】:

    标签: python diacritics


    【解决方案1】:

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

    解决方法是使您的语言环境与您的终端正在执行的操作相匹配——通过更改语言环境或确保您的终端是 utf-8。

    【讨论】:

    • 您好 Henning,我的终端配置为使用 utf-8: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=跨度>
    • @Thomas:这并没有显示您的终端是如何配置的,只显示了在该 shell 中运行的应用程序的行为方式。
    • @Ignacio,那么线索是什么?当我更新我的问题时,当将此文本插入 mysql 时,我遇到了同样的问题。
    • 当底层文本使用拉丁脚本时,“utf-8 字节被解释为 latin-1”的经典线索是重音大写元音后跟奇怪的标点符号。您的输出完美匹配。因此 Python 和数据库都根据您设置的语言环境完美运行,但是您为正在使用的终端仿真器设置了错误的语言环境。语言环境的功能是通知程序终端的行为——它实际上并不控制终端的行为。
    • 那么,您对在终端和数据库中显示重读元音有何建议?我试图将表排序规则更改为 latin1,但我仍然遇到同样的问题。如何更改终端行为以理解“latin-1”?
    【解决方案2】:

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

    这是我使用的代码:

    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?

    【讨论】:

      猜你喜欢
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      相关资源
      最近更新 更多