歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 深入理解Python字符集編碼

深入理解Python字符集編碼

日期:2017/3/1 9:26:24   编辑:Linux編程

在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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved