python得到系統默認編碼方式


Python獲取系統默認字符編碼

 首先要搞清楚,字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

decode的作用是將其他編碼的字符串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字符串轉換成unicode編碼。

encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode('gb2312'),表示將unicode編碼的字符串轉換成gb2312編碼。

在某些IDE中,字符串的輸出總是出現亂碼,甚至錯誤,其實是由於IDE的結果輸出控制台自身不能顯示字符串的編碼,而不是程序本身的問題。

如在UliPad中運行如下代碼:

s=u"中文"
print s

會提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。這是因為UliPad在英文WindowsXP上的控制台信息輸出窗口是按照ascii編碼輸出的(英文系統的默認編碼是ascii),而上面代碼中的字符串是Unicode編碼的,所以輸出時產生了錯誤。

將最后一句改為:print s.encode('gb2312')

則能正確輸出“中文”兩個字。

若最后一句改為:print s.encode('utf8')

則輸出:\xe4\xb8\xad\xe6\x96\x87,這是控制台信息輸出窗口按照ascii編碼輸出utf8編碼的字符串的結果。

另外,代碼中字符串的默認編碼與代碼文件本身的編碼一致,如:

s='中文'

如果是在utf8的文件中,該字符串就是utf8編碼,如果是在gb2312的文件中,則其編碼為gb2312。 這種情況下,要進行編碼轉換,都需要先用decode方法將其轉換成unicode編碼,再使用encode方法將其轉換成其他編碼。通常,在沒有指定特定的編碼方式時,都是使用的系統默認編碼創建的代碼文件,在這篇文章中可以看到如何獲得系統的默認編碼。

如果字符串是這樣定義:

s=u'中文'

則該字符串的編碼就被指定為unicode了,即python的內部編碼,而與代碼文件本身的編碼無關。因此,對於這種情況做編碼轉換,只需要直接使用encode方法將其轉換成指定編碼即可。

如果一個字符串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷:

isinstance(s, unicode)  #用來判斷是否為unicode

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

在Python代碼中,普通字符串的編碼方式與程序源文件編碼方式一致的,而很多IDE在默認情況下,將程序源文件按照系統默認字符編碼來保存的。

下面給出用Python獲取系統默認編碼的例子:

#!/usr/bin/env python
#coding=utf-8
"""
    獲取系統默認編碼
"""
import sys
print sys.getdefaultencoding()

該段程序在英文WindowsXP上輸出為:

ascii 

***********************************

修改python默認的編碼方式

今天碰到了 python 編碼問題, 報錯信息如下
Traceback (most recent call last):
  File "ntpath.pyc", line 108, in join
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa1 in position 36: ordinal not in range(128)

顯然是當前的編碼為ascii, 無法解析0xa1(十進制為161, 超過上限128). 進入python console后, 發現默認編碼確實是 ascii, 驗證過程為:

>>>import sys
>>>sys.getdefaultencoding()
#輸出為ascii.

#在使用 sys.setdefaultencoding('utf8'), 報錯!
>>>sys.setdefaultencoding('utf8')
AttributeError: 'module' object has no attribute 'setdefaultencoding'

google 到一個 limodou 回復的帖子, http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=580942&page=15&view=collapsed&sb=5&o=

limodou講到, sys.setdefaultencoding 方法在python導入 site.py 后就刪除了, 不能再被調用了.  在確定sys已經導入的情況下, 可以reload sys這個模塊, 之后, 再 sys.setdefaultencoding('utf8')
>>>reload(sys)
>>>sys.setdefaultencoding('utf8')

確實有效, 根據 limodou 講解,  site.py 是 python 解釋器啟動后, 默認加載的一個腳本. 如果使用 python -S 啟動的話, 將不會自動加載 site.py.

上面寫的挺啰嗦的.

==================================
如何永久地將默認編碼設置為utf-8呢?  有2種方法:
==================================
第一個方法<不推薦>: 編輯site.py, 修改setencoding()函數, 強制設置為 utf-8
第二個方法<推薦>: 增加一個名為 sitecustomize.py, 推薦存放的路徑為 site-packages 目錄下
sitecustomize.py 是在 site.py 被import 執行的, 因為 sys.setdefaultencoding() 是在 site.py 的結尾處被刪除的, 所以, 可以在 sitecustomize.py 使用 sys.setdefaultencoding().
#file name:  sitecustomize.py
import sys  
sys.setdefaultencoding('utf-8')   

既然 sitecustomize.py 能被自動加載,  所以除了設置編碼外, 也可以設置一些其他的東西. 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM