在我的Python腳本中,它運行在Ubuntu的命令行上,它從MySQL數據庫中選擇UTF8編碼的內容。用Python腳本在Ubuntu終端中顯示UTF8腳本
然後,我想打印字符串到控制檯。
顯示的字符串有編碼問題,因爲它們沒有正確顯示重音字符。我該如何解決?
優選地,腳本將作出決定而不是設置系統環境,以確保在其他系統上輕鬆運行。
在我的Python腳本中,它運行在Ubuntu的命令行上,它從MySQL數據庫中選擇UTF8編碼的內容。用Python腳本在Ubuntu終端中顯示UTF8腳本
然後,我想打印字符串到控制檯。
顯示的字符串有編碼問題,因爲它們沒有正確顯示重音字符。我該如何解決?
優選地,腳本將作出決定而不是設置系統環境,以確保在其他系統上輕鬆運行。
非常強烈建議您不要使用「?」作爲替代字符。只需將您的輸出編碼設置爲UTF-8並完成。
for s in ("stdin","stdout","stderr"):
setattr(sys, s, io.TextIOWrapper(getattr(sys, s).detach(), encoding="utf8"))
或者,讓蟒蛇停止猜測輸出的編碼設置您PYTHONIOENCODING
envariable爲utf8。
兩種方法都比手動編碼要好得多,這是愚蠢的。
如果您拒絕升級到Python3,我還建議
from __future__ import unicode_literals
驅逐所有的愚蠢u'...'
東西。
最近,我開始我所有的Python progams這樣的:
#!/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!!")
謝謝。在我使用了編輯: '進口重新 進口SYS 進口OS 如果不是((在os.environ 「PYTHONIOENCODING」) 和 re.search( 「^ UTF-8個$?」,os.environ [ 「PYTHONIOENCODING」],re.I)) sys.stderr.write(sys.argv [0] +「依賴關係我無法解決您的第一個代碼運行問題。 – eoinoc
你可以得到STDOUT的這樣當前編碼:
>>> import sys
>>> sys.stdout.encoding
UTF-8
然後編碼的Unicode字符串相應:
>>> u"Ä"
u'\xc4'
>>> sys.stdout.write(u"Ä".encode(enc, 'replace'))
的'replace'避免UnicodeEncodeErrors,當一個字符不是在終端的所能表述編碼。這將被替換爲問號。
文本的輸入編碼(UTF-8在這裏)沒有關係。應該轉換UTF8-字節串儘快然後轉換成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。
你確定你的語言環境設置與終端實際相匹配嗎? –
千萬不要依賴終端設置。將所有的編碼內容設置爲UTF-8並消除所有這些heisenbugs。 – tchrist