中文編碼3 python中的編譯碼攻略

2021-08-21 13:37:44 字數 2683 閱讀 9505

**:

正如其他語言一樣,在python的世界裡也有有字元的編譯碼問題;有的在命令列回顯時出現,有的在讀取檔案時出現,有的在執行命令時出現,有的在讀取資料庫時出現,不盡相同。

注:如未特別申明下文中的編譯碼均特指字串的編譯碼。

之所以會出現編譯碼問題是因為程式不同處理過程中與外界輸入、輸出所有使用的編碼規則不一致所造成的,所以要解決編譯碼問題就要先理清怎麼使得所有的編譯碼都一致。包括python檔案、python系統、db、普通檔案等等。

乙個是python原始檔頭部設定的編碼申明,如:# –– coding: utf-8 –– ;這個決定檔案載入時解碼的格式

我們在儲存和設定python檔案編碼時務必要讓2者保持一致即可,通常一般都設定為utf-8。

python系統的預設編碼為unicode,它不是乙個具體的編碼實現,可以理解為python中各編碼的中間變數,所有其它編碼進行轉換的時候,首先都要轉換成unicode,然後在由unicode轉成成目標編碼格式。

如何得到unicode物件?

s=u'中國'

s=unicode('中國')

s='中國'.decode(code) ##code => utf-8, gbk

通常我們在需要顯示轉碼的時候會給定乙個編譯碼的格式,如:utf-8、gbk;而在某些情況下會用到隱式的轉碼格式,比如列印內容時沒有提供給我們設定編碼的介面,這時就用到python系統中的設定目標編碼格式;(因為unicode不是最終編碼必須要轉換成可回顯的編碼格式)

python預設的編碼取值

1、系統的預設編碼

2、ide設定的編碼

3、**設定的編碼

優先順序越來越高,如何通過**設定python系統預設的編碼方式?

import sys

print sys.getdefaultencoding()

reload(sys)

sys.setdefaultencoding("utf-8") ##設定預設編碼方式為utf-8

print sys.getdefaultencoding()

所以務必在設定預設編碼方式的時候要設定成與檔案儲存的編譯碼一致,這樣就可以避免列印出亂碼,或者列印時需要預先進行編碼轉換。

python在讀取資料庫時可以指定連線資料的編碼格式,具體需要使用什麼格式取決於資料庫儲存時的編碼格式;當資料庫的儲存格式與我們python中設定的編碼不一致時,在讀取時就需要注意轉換了。

比如:mysql的資料庫編碼為gbk,而我們的python程式編碼使用的utf-8,那麼在連線資料庫時需要使用gbk進行連線,

conn=mysqldb.connect(host="localhost",user="root",passwd="root",db="tw",charset="gbk")
這樣讀取出來的字元編碼是解碼後的unicode,我們可以直接進行相關操作。

python中讀寫檔案可以直接使用open,file等函式,但是也提供了更專業的模組來幫助我們寫入指定編碼型別的檔案;這就用到了codecs模組了。

import codecs

of = codecs.open('test.txt', 'rw', 'utf8')

這樣不論讀寫都是按照指定的編碼來進行的,同樣該模組還支援其他字元的編碼處理

a = '中國'

coder = codecs.lookup('utf-8') ##建立指定編碼的編碼器

coder.decode(a) ##使用編碼器解碼

ide中一般設定編輯器環境為utf-8,workdir為utf-8;前者決定檔案儲存時的編碼方式,後者決定程式執行時的環境編碼。

這3個函式是python預設自帶的,通常我們使用這3個函式就可以很好的處理工作中遇到的字元編碼問題;

a = '中國'

b = a.decode('gbk') ##解碼gbk為unicode

c = b.encode('utf-8') ##unicode編碼成utf-8

d = unicode(a) ##使用python環境預設編碼來解碼成unicode,即sys.getdefaultencoding決定

str = '中國' 

for code in ['utf-8', 'gbk']:

if str.decode(code, 'ignore')==str.decode(code, 'replace'):

print code

break

for code in ['utf-8', 'gbk']:

try:

str.decode(code)

print code

break

except(e):

pass

import chardet

print chardet.detect(str)

3,Python中的序列

2 元組 字典列表屬於可變序列,可以任意改變其中的元素。a 19.8,5 jacub true,5 列表可以包含各種型別的元素 b len a b的值是列表a的長度 元素的數量 print a 2 列印列表a中索引為2的元素 print a.index 19.8 列印列表a中 19.8 這個元素的索...

3 python的傳入引數

def func a,b print a b func 1,2 3 def jia a,b 6 print a b jia 4 10 傳入乙個列表,嚴格地說這不是可變引數 def calc l sum 0 for n in l sum n return sum calc 1,2,3 7 這才是可變引...

python中中文編碼問題

編碼問題一直是很頭痛的問題 當字串是 u4e2d u56fd s u4e2d u56fd u6e05 u534e u5927 u5b66 str s 0 decode unicode escape encode euc kr print str 中國當字串是 東亞學團一中 print unichr ...