python字符集編碼深入理解

2021-06-29 14:00:30 字數 3150 閱讀 6031

python中和字串相關的型別,分別是str,unicode兩種不同的型別:

basestring

|+--str

|+-- unicode

指令碼字元編碼:

指指令碼檔案本身是用何種字元編碼的,預設情況python直譯器(直譯器就是執行python

程式的程式)認為指令碼是ascii碼:

#test.py

print "你好"

上面是test.py指令碼,執行 python test.py 就會包如下錯誤:

file 「test.py」, line 1yntaxerror: non-ascii character 『\xe4′ in file test.py on line 1, but no encoding declared; see for details

所以如果檔案中要使用非ascii編碼的字串,就必須在檔案頭部宣告:

#coding=utf8

#或者# coding=gb18030

這樣就相當於告訴python直譯器使用utf8編碼或者gb18030來解釋指令碼檔案。

直譯器 字元編碼:

直譯器字元編碼是指直譯器內部認為的str型別的字串的編碼,也就是說python直譯器會把str型別的字串當作何種字元編碼來處理。預設,python直譯器字元編碼

也是ascii的。可以通過命令檢視:

>>> sys.getdefaultencoding()

'ascii'

不同的字元編碼集如utf-8、gbk、iso8859-1等等的字串(注:這些字元編碼集都是針對str型別的字串而言的,unicode字串沒有字符集這類說法)之間相互轉換是怎麼進行的呢?答案就是他們通過乙個中間橋梁unicode來轉換,相關的兩個方法是decode和encode。

#從str型別的字串轉換到unicode

s.decode(encoding) *****>to #從str型別的字串轉換到unicode

u.encode(encoding) *****>to

問題:現在假設我想要把乙個gbk字元編碼的str物件轉換為utf-8的str物件,該如何轉換呢?

現在預設我是在windows下操作,作業系統的字元編碼預設是gbk的,

>>> s="你好"

>>> s

'\xc4\xe3\xba\xc3'

>>> len(s)

4

gbk字元編碼的兩個中文的長度是4,如果是utf-8編碼的字串「你好」的長度是6,稍後我們把「s」轉換成utf-8的看看是不是長度為6。

首先我們要先把」s」轉換成unicode,在從unicode轉換成utf-8編碼的str物件:

>>> s1 = s.decode('gbk').encode('utf-8')

>>> s1

'\xe4\xbd\xa0\xe5\xa5\xbd'

>>> len(s1)

6>>>

實驗證明s1就是乙個utf-8編碼的str型別的字串物件。

str(s)與unicode(s)

str(s)和unicode(s)是兩個工廠方法,分別返回str字串物件和unicode字串物件,str(s)是s.encode(『ascii』)的簡寫。實驗:

>>> s3 = u"你好"

>>> s3

u'\u4f60\u597d'

>>> str(s3)

traceback (most recent call last):

file "", line 1, in unicodeencodeerror: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

上面s3是unicode型別的字串,str(s3)相當於是執行s3.encode(『ascii』),前面介紹過python直譯器預設字元編碼是』ascii』的,之所以報錯是因為轉換後的s3裡面含有非ascii字元(ascii只能表示0-127之間的ascii碼字元)。所以就報錯了,正確的指定編碼:s3.encode(『gbk』)就不會出現這個問題了。類似的unicode有同樣的錯誤:

>>> s4 = "你好"

>>> unicode(s4)

traceback (most recent call last):

file "", line 1, in unicodedecodeerror: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

>>>

unicode(s4)等效於s4.decode(『ascii』),而這裡s4是gbk字元編碼的(因為我的作業系統預設編碼是gbk),因此要正確的轉換就要正確指定其編碼s4.deocde(『gbk』)。

更新

對於如unicode形式的字串(str型別):

s = 'id\u003d215903184\u0026index\u003d0\u0026st\u003d52\u0026sid』
轉換成真正的unicode需要使用:

s.decode('unicode-escape')
測試:

>>> s = 'id\u003d215903184\u0026index\u003d0\u0026st\u003d52\u0026sid\u003d95000\u0026i'

>>> print(type(s))

>>> s = s.decode('unicode-escape')

>>> s

u'id=215903184&index=0&st=52&sid=95000&i'

>>> print(type(s))

>>>

來自:

深入理解python字元編碼

整理python在檔案讀取時報錯和cpu執行時字串報錯unicodeencodeerror unicodedecodeerror 解釋py2和py3字串資料型別,和bytes和unicode在py2和py3中的不同表現形式。1.編碼和解碼 2.python 2中的字元編碼 3.python 3中的字...

編碼方式和字符集理解

1 概念 位 bit 資料儲存的最小單位。位,簡記為b,也稱為位元,每個0或1就是乙個位 bit 計算機中的cpu位數指的是cpu一次能處理的最大位數。位元組 byte 8 bit就稱為乙個位元組 byte 2 ascii 美國資訊交換標準 americanstandard code for inf...

python與字符集編碼

講的比較明白的部落格 以上面博文的漢為例子,漢字的gbk編碼是baba,unicode碼字是6c49 utf16 le編碼是496c,utf 8編碼是e6b189 python檔案的編碼制定為gbk line 漢 input line.decode gbk ignore encode utf 8 r...