緣起
看到這樣的數據:Marek Čech、Beniardá怎樣變成相對應的ascii碼呢
解決
import unicodedata s = u"Marek Čech" #(u表示是unicode而非 ascii碼,不加報錯!) line = unicodedata.normalize('NFKD',s).encode('ascii','ignore') print line
結果
Marek Cech
python 2.* 中文編碼問題
問題要從文字的編碼講起。原本的英文編碼只有0~255(28),剛好是8位1個字節。為了使計算機表示各種不同的語言,1個字節是大大不夠的,自然要進行擴充。中文的話有GB系列、UTF-8,那么,它們之間是什么關系呢?
Unicode是一種編碼方案,又稱萬國碼,可見其包含之廣。但是具體存儲到計算機上,並不用這種編碼,而是用自身默認的編碼方式,utf-8是互聯網上使用的最廣的一種Unicode的實現方式。UTF-8或者gbk也可以進行解碼(decode)還原為Unicode。
在python中Unicode是一類對象,表現為以u打頭的,比如u'中文',而string又是一類對象,是在具體編碼方式下的實際存在計算機上的字符串。比如utf-8編碼下的'中文'和gbk編碼下的漢字“中華”,並不相同。例如
設計python的幾個函數
encode():編碼 decode():解碼 repr():返回一個可以用來表示對象的可打印的字串
默認編碼問題
#coding: gbk str1 = '汗' print repr(str1) str2 = u'汗' print repr(str2) str3 = str2.encode('utf-8') str4 = str2.encode('gbk') print repr(str3) print repr(str4) str5 = str3.decode('utf-8') print repr(str5)
執行程序出現問題:
說gbk編碼器不能解碼。原因是何?看看自己的linux配置,用命令“locale”
其中,與中文輸入關系最密切的就是 LC_CTYPE, LC_CTYPE 規定了系統內有效的字符以及這些字符的分類,諸如什么是大寫字母,小寫字母,大小寫轉換,標點符號、可打印字符和其他的字符屬性等方面。而locale定義zh_CN中最最重要的一項就是定義了漢字(Class “hanzi”)這一個大類,當然也是用Unicode描述的,這就讓中文字符在Linux系統中成為合法的有效字符,而且不論它們是用什么字符集編碼的。
簡單說:程序中寫了個str1 = '汗',默認編碼是utf-8,當賦予變量str1的時候,因為此時設定的編碼為gbk,驢唇不對馬嘴,編碼與解碼不一致,導致解碼錯誤。
修改如下(左),結果(右)