1. 程式人生 > >Python 字元編碼學習-ascii編碼,Unicode和UTF-8之間的關係

Python 字元編碼學習-ascii編碼,Unicode和UTF-8之間的關係

ascii編碼,Unicode和UTF-8之間的關係

1,ascii編碼,這是一種單位元組編碼,8位,一個char的長度。最多可以存放255中不同的字元。對於早期的計算機系統來說,對於應付英文字元和一些符號綽綽有餘了。 事實上基本的ascii碼只用了128個。

2,Unicode編碼。推出這種編碼實屬無奈。因為全世界人民都要使用計算機了,各種語言文字全都需要編碼表示。各種象形文字,如漢字,日語,漢語,阿拉伯語等等。單單我們使用的漢字就能夠貢獻幾萬個基礎字元。所以字元編碼必須增加長度。一開始覺得那就改成雙字元吧。 雙字元,2位char。可以表示65536個不同的字元。但是,電腦科學家還是低估了人類的字元數量。僅漢字就將近十萬個 -_-。
無奈,只好繼續擴充套件Unicode的編碼長度。增加到4個位元組。一共可以表示4億多個不同的字元了。 哈哈,這下可以夠用了吧。 事實上,沒有到4位元組那麼多,中文也只用到兩位元組。事實上只收錄了2萬多個漢字,因為日常生活其實幾千個漢字也就足夠了。所以給孩子起名字如果使用的字超過這2萬字的範圍,那在電腦是無法錄入的。

3,utf-8. 這樣使用Unicode的話,所有字元都按照兩個字元傳就OK了。也就是原來的 ‘a’,現在也必須要傳兩個字元。這樣一來美國人民不高興了,這意味著好好的,網速下降了一半。這就不好玩了。假如你是一個美國人,本來下載一個電影要10個小時,現在變成20個小時了。
這樣,只好開發出了第三種編碼,也就是utf8. 它的目的就是為了讓美國人和中國人都高興。
具體來說,這是一種變長的編碼規範。在utf8中,原來的ascii的部分,還是使用一個字元。保證速度不會下降。作為犧牲,對於中文部分,就要使用3個字元來傳遞。也就是為了提高他們的使用舒適度,降低了我們的使用舒適度。
寫到這裡,又有一絲絲感慨。
下面是一個Unicode轉換到utf8的規則。只要手動轉漢字一個就清楚了。

Unicode符號範圍 | UTF-8編碼方式
(十六進位制) | (二進位制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

在Python中實驗Unicode和UTF8

python 中 str其實是位元組串, unicode才是真正意義上的字串

#coding=utf-8
import sys 
import urllib

a=u"漢"
print type(a) #<type 'unicode'> print len(a) #1 print repr(a) #u'\u6c49' print b="漢" print type(b) #<type 'str'> print len(b) #3 print repr(b) #'\xe6\xb1\x89' s2 = b.decode('UTF-8') print s2 #漢 print type(s2) #<type 'unicode'> print s3 = a.encode('UTF-8') print s3 #漢 print type(s3) #<type 'str'>

這段程式碼千萬不要忽略了第一句。# coding: UTF-8
這表明這個程式碼的原始檔使用utf8進行編寫。因為你在原始檔中使用了中文。 如果你使用了中文,而沒有這個宣告的話,編譯肯定都要出錯的。就會報下面的錯誤。

  File "test_urlencode.py", line 4
SyntaxError: Non-ASCII character '\xe6' in file urlencode.py on line 4, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

在Python中,字串前面加個u,這個字串就用Unicode編碼了。Unicode使用雙位元組編碼,所以對於”漢”這個字元,len測長度就是1,因為這確實是一個字。在Unicode中,“漢”的編碼是6c49

對於變數b,沒有在字串前加u,因為原始檔是用utf8編碼的,所以變數b的字串就是用utf8編碼的。
型別是str。len測試長度是3。表示這個字在用utf8編碼後,要用3個位元組來表示。”漢”在utf8中的編碼是\xe6\xb1\x89。 可以自己用上面的規則,手工進行一下Unicode到utf8的轉化,就更清楚了。

這裡寫圖片描述

decode 和 encode的方向問題
程式的後兩句說明
從unicode到str的過程叫做編碼encode,
返回來,從str 到 Unicode的過程叫做 解碼decode。

原始檔字元編碼宣告

原始碼檔案中,如果有用到非ASCII字元,則需要在檔案頭部進行字元編碼的宣告,如下:

#-*- coding: UTF-8 -*-

實際上Python只檢查#、coding和編碼字串,其他的字元都是為了美觀加上的。
所以

#-*- coding: UTF-8 -*-
#coding: UTF-8  

這兩句是一樣的。

另外,Python中可用的字元編碼有很多,並且還有許多別名,還不區分大小寫,比如UTF-8可以寫成u8。

改變系統編碼

import sys
reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入sys模組。
sys.setdefaultencoding(‘utf-8’)