python unicode 編碼整理

2021-09-18 00:11:33 字數 2725 閱讀 3089

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,列印出來的兩個雙位元組的數字分別表示了兩個漢字『美的』。

encodedecode提供 str 和 unicode 這兩種的型別的互相轉化。

本質上,str是存放的位元組序,有可能是 ascii, gbk, utf-8 等等中的任意一種,通過呼叫 decode 可以把他們轉化成 unicode ,預設的 decode 編碼是 ascii 。str中到底是用的哪一種編碼,取決於它所在的場景,跟 locale ,檔案編碼等等都有關係。

#!/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...