在我在Ubuntu命令行运行的Python脚本中,它从MySQL数据库中选择UTF8编码的内容。
然后,我想将字符串打印到控制台。
显示的字符串存在编码问题,因为它们没有正确显示重音字符。我该如何解决这个问题?
最好,脚本会做出决定,而不是设置系统环境,以确保在其他系统上轻松运行。
答案 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)
sys.stdout
以使用utf8为您编码文本输出编码由运行脚本的环境指定,该环境基于区域设置(LANG
,LC_CTYPE
,LC_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。