在python中和字符串相關的類型,分別是str,unicode兩種不同的類型:
basestring
|
+--str
|
+-- unicode
腳本字符編碼:
指腳本文件本身是用何種字符編碼的,默認情況Python解釋器(解釋器就是執行python程序的程序)認為腳本是ascii碼:
#test.py
print "你好"
上面是test.py腳本,運行 python test.py 就會包如下錯誤:
File “test.py”, line 1 yntaxError: Non-ASCII character ‘\xe4′ in file test.py on line 1, but no encoding declared; see http://www.python.org/ ps/pep-0263.html 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) =====><type 'str'> to <type 'unicode'>
#從str類型的字符串轉換到unicode
u.encode(encoding) =====><type 'unicode'> to <type 'str'>
問題:現在假設我想要把一個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 "<stdin>", line 1, in <module>
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 "<stdin>", line 1, in <module>
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))
<type 'str'>
>>> s = s.decode('unicode-escape')
>>> s
u'id=215903184&index=0&st=52&sid=95000&i'
>>> print(type(s))
<type 'unicode'>
>>>
下面關於Python的文章您也可能喜歡,不妨看看:
Python:在指定目錄下查找滿足條件的文件 http://www.linuxidc.com/Linux/2015-08/121283.htm
Python2.7.7源碼分析 http://www.linuxidc.com/Linux/2015-08/121168.htm
無需操作系統直接運行 Python 代碼 http://www.linuxidc.com/Linux/2015-05/117357.htm
CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm
《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm
在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm
Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡