歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python 字符串編解碼研究

Python 2.X 在輸入漢字和特殊字符的時候,經常遇到編碼解碼的問題,究其原因,編譯器默認將文件當做ascii編碼,因此要正確的實現編解碼的轉換,需要進行一些設置。

首先讓我們來了解幾個概念。

文件編碼、字符串編碼、系統編碼

  1. 代碼中字符串的默認編碼與代碼文件本身的編碼一致。
    舉個例子,如果是在utf8的文件中,那麼字符串就是utf8編碼;如果是在gb2312的文件中,則其編碼為gb2312。 但是,如果指明了字符串為unicode字符串,那麼就是unicode編碼。
  2. 代碼文件的默認編碼與系統編碼一致,因此如果不指定文件的編碼,那麼默認的編碼格式就是系統編碼。 那麼如何查看系統編碼?
    env |grep -i lang
    或者,在交互式python命令行下,執行如下命令:
    import sys
    sys.getdefaultencoding()
    輸出一般都是ascii,系統編碼一般是utf8,所以需要先把二者統一。

如何設置編碼

方法1

在python文件開頭加上# –– coding: utf-8 –– 來識別中文並能夠把中文正確的轉換為unicode。

方法2

修改python的默認系統編碼

>>> import sys,locale
>>> sys.getdefaultencoding()
'ascii'
>>> sys.setdefaultencoding()  #這裡會報錯,找不到setdefaultencoding()函數
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys) #需要reload。
<module 'sys' (built-in)>
>>> locale.getdefaultlocale()
('zh_CN', 'UTF-8')
>>> sys.setdefaultencoding("UTF-8") #把編碼與操作系統統一起來
>>> sys.getdefaultencoding()
'UTF-8'

之所以要reload(sys),因為python環境在初始化的時候要執行site.py這個文件,而為了防止用戶修改python的默認編碼,在site.py文件中會把setdefaultencoding()函數del 掉,因此我們必須通過reload(sys)把這個函數找回來。 有興趣的不妨自己試一下:
rpm -qa|grep python26 找到python的包
然後rpm -q -l python26-2.6.8-1.el5|grep site.py 找到site.py文件的位置
我的機器上是:/usr/lib64/python2.6/site.py
vi打開,main函數裡面,有一段:

if ENABLE_USER_SITE:
    execusercustomize()
# Remove sys.setdefaultencoding() so that users cannot change the
# encoding after initialization.  The test for presence is needed when
# this module is run as a script, because this code is executed twice.
if hasattr(sys, "setdefaultencoding"):
    del sys.setdefaultencoding

重新reload一下sys,把setdefaultencoding函數給找回來。再setdefaultencoding就對了。

編碼與解碼

環境設置正確後,就可以進行編碼轉換了。python中的編碼轉換用decode和encode來實現,unicode編碼可以認為是各種編碼之間轉換的橋梁。

  • decode的作用是將其他編碼的字符串轉換成unicode編碼,如str1.decode(‘gb2312’),表示將gb2312編碼的字符串str1轉換成unicode編碼,因此,如果str1本身不是gb2312編碼,就會報錯。
  • encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode(‘gb2312’),表示將unicode編碼的字符串str2轉換成gb2312編碼,因此,需要str2本身的編碼是unicode。
    總結一下,
  • u.encode(‘…’)基本上總是能成功的,只要你填寫了正確的目標編碼。這就像任何文件都可以壓縮成zip文件,是一個道理。
  • s.decode(‘…’)經常會出錯,因為s是什麼“編碼”取決於上下文,當你解碼的時候需要確保s是用什編碼。就像打開zip文件的時候,你要確保它確實是zip文件,而不僅僅是偽造了擴展名的zip文件。

Python3中,已經默認采用utf8編碼了。

Python向PHP發起GET與POST請求 http://www.linuxidc.com/Linux/2014-10/107903.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