這裡簡單的說一下。(下面內容基本上時從《Python.Core.Programming.2ed》上摘的)
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字串,用以確認程式正確地運行。
在Linux中編寫,在VIM中輸入如下代碼,儲存為uniFile.py,紅字是我加的注釋
#
/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 列印
在終端中輸入:python uniFile.py
結果列印出 Hello world
然後我們在python目錄下會發現多了一個名為unicode.txt的檔案,用cat命令查看一下,發現裡面的內容和列印的結果一樣.
把Unicode應用到實際中注意一下四點:
1 程式中出現字串時一定要加一個首碼u
2
不要用str()函數,用Unicode()代替
3
不要用過時的string模組。如果傳給它非ASCII碼,它會把一切搞砸。
4
不到必須時不要在你的程式裡編解碼Unicode字元,只在你要寫入檔案或者資料庫或者網路時,才調用encode()函數和decode()函數。