unicode 只定義字元對應的數字,但沒有規定這些數字如何儲存起來,比如像中文的『我』字儲存時需要兩個位元組來表示,而英文本母a卻只需要乙個位元組,有些其他的字元可能需要3-4個位元組。
utf-8 是對 unicode 編碼儲存的一種實現方式,同樣的還有 utf-16, utf-32。
utf-8 是使用最廣泛的編碼方式,採用變長的編碼方式,可以使用1-4個位元組來表示乙個字元; utf-16 用2個或4個位元組,utf-32 用4個位元組表示。編碼規則如下:
對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母, utf-8編碼和ascii碼是相同的。
對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。
python2 中有字串型別有兩種:byte string (str)
和unicode string (unicode)
。
>>> s = '美的'
>>> s
'\xe7\xbe\x8e\xe7\x9a\x84'
>>> s = u'美的'
>>> s
u'\u7f8e\u7684'
>>> s = '美的'
>>> s.decode('utf-8')
u'\u7f8e\u7684'
上面的輸出中,第乙個s的型別是 str,列印出來的內容是 utf-8 編碼過的內容。第二個s的型別是 unicode,列印出來的兩個雙位元組的數字分別表示了兩個漢字『美的』。
本質上,str是存放的位元組序,有可能是 ascii, gbk, utf-8 等等中的任意一種,通過呼叫 decode 可以把他們轉化成 unicode ,預設的 decode 編碼是 ascii 。str中到底是用的哪一種編碼,取決於它所在的場景,跟 locale ,檔案編碼等等都有關係。encode
和decode
提供 str 和 unicode 這兩種的型別的互相轉化。
#!/usr/bin/env python
# -*- coding: gbk -*-
s = u'中文'
print repr(s)
print repr(s.encode('gbk'))
比如上面的檔案enc.py
,儲存的時候選擇檔案編碼
是gbk,程式檔案本質上也是檔案,當我們使用某個外部的應用 開啟它時(編輯器或者python直譯器等),外部應用是不知道該檔案的編碼格式的,
這個時候有三種情況:
試驗一下,把# -*- coding: gbk -*-
刪除後,執行python enc.py
,輸出:
file "enc.py", line 4
syntaxerror: non-ascii character '\xd6' in file enc.py on line 4, but no encoding declared;
試著用vim開啟該檔案時,『中文』兩個字就會顯示成亂碼,因為vim預設的檔案編碼方式被設定成utf-8了。
#!/usr/bin/env python
# -*- coding: gbk -*-
s1 = u'中文'
print repr(s1)
print repr(s1.encode('gbk'))
s2 = '中文'
print repr(s2)
print repr(s2.decode('gbk'))
輸出結果:
u'\u4e2d\u6587'
'\xd6\xd0\xce\xc4'
'\xd6\xd0\xce\xc4'
u'\u4e2d\u6587'
從這裡可以看出來, s2中存放的是byte格式的從檔案中讀到的gbk編碼的內容。
再看下面的這段**,程式檔案utf8_enc.py
,儲存成utf-8編碼的。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
s1 = u'中文'
print repr(s1)
print repr(s1.encode('gbk'))
s2 = '中文'
print repr(s2)
print repr(s2.decode('gbk'))
輸出:
u'\u4e2d\u6587'
'\xd6\xd0\xce\xc4'
'\xe4\xb8\xad\xe6\x96\x87'
traceback (most recent call last):
file "unicode_enc.py", line 12, in print repr(s2.decode('gbk'))
unicodedecodeerror: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
這裡同樣可以知道,s2中存放的是檔案儲存的編碼utf-8的byte碼。 python Unicode 編碼問題
今天在用python寫分頁 傳入兩個引數 page num,page size,報錯了 我用的是python2.7 列印變數型別是unicode 所以要把unicode 轉成 int 提供兩種方法,都是先轉成字串,再轉成int page num int filter str.isdigit,page...
python unicode編碼轉換
python unicode編碼轉換 chr 20000 北 ord 函式主要用來返回對應字元的ascii碼,chr 主要用來表示ascii碼對應的字元他的輸入時數字,可以用十進位制,也可以用十六進製制。print ord a 97print chr 97 aprint chr 0x61 a乙個簡單...
對Python unicode編碼的說明
字串在python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼 decode 成unicode,再從unicode編碼 encode 成另一種編碼。decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.dec...