在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...