2011-08-11 73 views
1

在我的Python腳本中,它運行在Ubuntu的命令行上,它從MySQL數據庫中選擇UTF8編碼的內容。用Python腳本在Ubuntu終端中顯示UTF8腳本

然後,我想打印字符串到控制檯。

顯示的字符串有編碼問題,因爲它們沒有正確顯示重音字符。我該如何解決?

優選地,腳本將作出決定而不是設置系統環境,以確保在其他系統上輕鬆運行。

+0

你確定你的語言環境設置與終端實際相匹配嗎? –

+0

千萬不要依賴終端設置。將所有的編碼內容設置爲UTF-8並消除所有這些heisenbugs。 – tchrist

回答

2

非常強烈建議您不要使用「?」作爲替代字符。只需將您的輸出編碼設置爲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!!") 
+0

謝謝。在我使用了編輯: '進口重新 進口SYS 進口OS 如果不是((在os.environ 「PYTHONIOENCODING」) 和 re.search( 「^ UTF-8個$?」,os.environ [ 「PYTHONIOENCODING」],re.I)) sys.stderr.write(sys.argv [0] +「依賴關係我無法解決您的第一個代碼運行問題。 – eoinoc

1

你可以得到STDOUT的這樣當前編碼:

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

然後編碼的Unicode字符串相應:

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

'replace'避免UnicodeEncodeErrors,當一個字符不是在終端的所能表述編碼。這將被替換爲問號。

0

文本的輸入編碼(UTF-8在這裏)沒有關係。應該轉換UTF8-字節串儘快然後轉換成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