Python學習筆記——Unicode (轉)


關於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()函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM