Python學習筆記——Unicode

來源:互聯網
上載者:User

這裡簡單的說一下。(下面內容基本上時從《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()函數。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.