使用Python脚本在Ubuntu的终端中显示UTF8 stings

时间:2011-08-11 18:17:12

标签: python unicode utf-8 character-encoding terminal

在我在Ubuntu命令行运行的Python脚本中,它从MySQL数据库中选择UTF8编码的内容。

然后,我想将字符串打印到控制台。

显示的字符串存在编码问题,因为它们没有正确显示重音字符。我该如何解决这个问题?

最好,脚本会做出决定,而不是设置系统环境,以确保在其他系统上轻松运行。

3 个答案:

答案 0 :(得分:2)

强烈建议您不要使用“?”作为替代炭。只需将输出编码设置为UTF-8即可。

for s in ("stdin","stdout","stderr"): 
   setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))

或者,将PYTHONIOENCODING变量设置为utf8,以便python停止猜测输出编码。

这两种方法都比手动编码好得多,这是愚蠢的。

如果您拒绝升级到Python3,我也建议

from __future__ import unicode_literals

消除所有那些愚蠢的u'...'东西。

最近我开始这样的所有Python程序:

#!/usr/bin/env python3.2
# -*- coding: UTF-8 -*-

from __future__ import print_function
from __future__ import unicode_literals

import re
import sys
import os

if not (("PYTHONIOENCODING" in os.environ)
            and
        re.search("^utf-?8$", os.environ["PYTHONIOENCODING"], re.I)):
    sys.stderr.write(sys.argv[0] + ": Please set your PYTHONIOENCODING envariable to utf8\n")
    sys.exit(1)

import unicodedata
if unicodedata.unidata_version < "6.0.0":
    print("WARNING: Your old UCD is out of date, expected at least 6.0.0 but got", 
           unicodedata.unidata_version)

wide_enough = (sys.maxunicode >= 0x10FFFF)
if not wide_enough:
    print("WARNING: Narrow build detected, your Python lacks full Unicode support!!")

答案 1 :(得分:1)

你可以像这样得到STDOUT的当前编码:

>>> import sys
>>> sys.stdout.encoding
UTF-8

然后相应地编码您的Unicode字符串:

>>> u"Ä"
u'\xc4'
>>> sys.stdout.write(u"Ä".encode(enc, 'replace'))

当一个字符在终端的编码中无法表示时,'replace'可以避免UnicodeEncodeErrors。然后将用问号代替。

答案 2 :(得分:0)

文本的输入编码(此处为utf-8)无关紧要。您应该尽快将utf8-bytestring转换为Unicode,然后打印文本:

print(unicode_text)
  • 打印前不要将文本编码为utf8
  • 不要修改sys.stdout以使用utf8为您编码文本

输出编码由运行脚本的环境指定,该环境​​基于区域设置(LANGLC_CTYPELC_ALL)或PYTHONIOENCODING envvar。不要无条件输出utf8。

例如,如果未设置区域设置;你可以明确指定它:

$ LANG=en_US.utf8 python your_script.py

确保您的终端能够显示相应的Unicode字符(字体,相应的区域设置(locale -a)已安装)。

换句话说,要修复输出,请修复环境,例如configure your locale settings to use C.UTF-8 by default