python 編碼

關於Unicode的詳細情況可以參考百度百科:http://baike.baidu.com/view/40801.htm

這裏簡單的說一下。(下面內容基本上時從《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模塊已經停止了更新,只保留了對ASXII碼的支持,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()函數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章