內容摘自《python核心程式設計》
unicode是計算機可以支援這個星球上的多種語言的秘密**,在unicode之前,用的都是ascii,ascii嗎非常簡單,每個英文本元都用7位二進位制數的方式儲存在計算機內,其範圍是32到126.它的實現原理這裡也不說了。
但是ascii碼只能表示95個可列印的字元,後來把ascii擴充套件到了8位,這樣就能表示223個字元了,雖然這個來表示歐美字母語言已經足夠了,但是對於像中文等語系來說就太少了。於是unicode碼誕生了。
unicode通過使用乙個或者多個位元組來表示乙個字元,這樣就突破了ascii的限制,這樣,unicode可以表示超過90000個字元了。
python 與unicode
為了讓unicode和ascii碼值的字串看起來盡可能的相像,python的字串從原來的簡單資料型別改變成了真正的物件,ascii字串成了stringtype,而unicode字串成了unicodetype型別,他們的行為非常相近。string模組裡面都有相應的處理函式。string模組已經停止了更新,只保留了對ascii碼的支援,string模組已經不推薦使用,在任何要跟unicode相容的**裡都不要再用該模組,python保留該模組僅僅為了向後相容。
python裡面預設所有字面上的字串都用ascii編碼,可以通過在字串前面加乙個『u』字首的方式宣告unicode字串,這個『u』字首告訴python後面的字串要編成unicode字串。
>>> "hello world" #ascii string
'hello world'
>>> u"hello world" #unicode string
u'hello world'
內建的str()函式和chr()函式不能處理unicode,它們只能處理常規ascii編碼的字串,如果乙個unicode字串作為引數傳給了str()函式,它會首先被轉換成ascii碼字串然後交給str()函式。
codecs
codec是把coder/decoder得首字母組合,它定義了文字跟二進位制的轉換方式,跟ascii那種用乙個位元組把字元轉換成數字的方式不同,unicode用的是多位元組,這導致了unicode支援多種不同的編碼方式,比如說codec支援的四種耳熟能詳的編碼方式是:ascii,iso8859—1/latin-1,utf-8,和utf-16
最著名的是utf-8編碼,它也用乙個位元組來編碼ascii字元,這讓那些必須同時處理ascii碼和unicode碼文字的程式設計師的工作變得非常輕鬆,因為ascii字元的utf-8編碼和ascii編碼完全相同。
utf-8編碼可以用1到4個位元組來表示其他語言的字元,這給那些需要直接處理unicode資料的程式設計師帶來了麻煩,因為他們沒有辦法按照固定長度逐一讀出各個字元,幸運的是我們不需要掌握直接讀取unicode資料的方法,python已經替我們完成了相關細節,我們無需為處理多位元組字元的複雜問題而擔心。
utf-16也是一種變長編碼,但是它不常用。
編碼解碼
unicode支援多種編碼格式,這為程式設計師帶來了額外的負擔,每當你向乙個檔案寫入字串的時候,你必須定義乙個編碼用於把對應的unicode內容轉換成你定義的格式,python通過unicode字串的encode()函式解決了這個問題,該函式接受字串中的字元為引數,輸出你指定的編碼格式的內容。
所以,每次我們寫乙個unicode字串到磁碟上我們都要用指定的編碼器給他「編碼「一下,相應地,當我們從這個檔案讀取資料時,我們必須」解碼」該檔案,使之成為unicode字串物件。
簡單的例子:
下面的**建立了乙個unicode字串,用utf-8編碼器將它編碼,然後寫入到乙個檔案中去,接著把資料從檔案中讀回來,解碼成unicode字串物件,最後,列印出unicode字串,用以確認程式正確地執行。
# /home/xiaopeng/python/code/unifile.py
'''an example of reading and writing unicode strings:writes
a unicode string to a file in utf-8 and reads it back in
'''
codec = 'utf-8' #編碼方式
file = 'unicode.txt' #要存的檔名
hello_out = u"hello world\n" #建立了乙個unicode格式的字串
bytes_out = hello_out.encode(codec) #用utf-8編碼
f = open(file,'w')
f.write(bytes_out) #寫入指定檔案中
f.close()
f = open(file,'r')
bytes_in = f.read() #讀取
f.close()
hello_in = bytes_in.decode(codec) #解碼
print hello_in #列印
結果列印出 hello world
然後我們在.py目錄下會發現多了乙個名為unicode.txt的檔案,用cat命令檢視一下,發現裡面的內容和列印的結果一樣.
把unicode應用到實際中注意一下四點:
1 程式中出現字串時一定要加乙個字首u
2 不要用str()函式,用unicode()代替
3 不要用過時的string模組。如果傳給它非ascii碼,它會把一切搞砸。
4 不到必須時不要在你的程式裡編譯碼unicode字元,只在你要寫入檔案或者資料庫或者網路時,才呼叫encode()函式和decode()函式。
Python關於list裡面的unicode編碼
利用python2.7結巴分詞對文字分詞之後存進list列表裡面 import jieba seg list jieba.cut 網路,讓我們之間的距離變的如此之近,也如此遙遠。a i for i in seg list a str a replace u s a.decode unicode es...
python教學筆記 python學習筆記(一)
1.eval 函式 eval是單詞evaluate的縮寫,就是 求.的值的意思。eval 函式的作用是把str轉換成list,dict,tuple.li 1 1,2,3 print eval li 1 di 1 print eval di 1 tu 1 2,4,6 print eval tu 1 執...
python學習筆記
coding utf 8 coding utf 8 應該像八股文一樣在每個指令碼的頭部宣告,這是個忠告 為了解決中文相容問題,同時你應該選擇支援 unicode 編碼的編輯器環境,保證在執行指令碼中的每個漢字都是使用 utf 8 編碼過的。cdays 5 exercise 3.py 求0 100之間...