寫之前必須先吐槽一句,字元編碼問題真是讓人頭疼啊啊啊啊!
這是美國標準資訊交換碼,用8位表示乙個字元,當然用這種方式表示所有的英文本母是完全夠用了,多餘的還能用來表示控制字元,標點符號等這些特殊字元。但是,當其他民族的語言也想被儲存到計算機中時,這種表示方式就完全不夠用了。
非英語民族為了滿足自己的語言的需要,都各自制訂了一套編碼規則,這寫規則統稱為mbcs(multi-byte character set),如gb***x,big***x等。這些編碼規則均使用了兩個位元組來進行編碼,所以mbcs又稱為dbcs。
必須明確的是,mbcs並不是某一種特定的編碼,windows裡根據你設定的區域不同,mbcs指代不同的編碼,而linux裡無法使用mbcs作為編碼。在windows中你看不到mbcs這幾個字元,因為微軟為了更加洋氣,使用了ansi來嚇唬人,記事本的另存為對話方塊裡編碼ansi就是mbcs。同時,在簡體中文windows預設的區域設定裡,指代gbk。
大家各自制定編碼規則雖然比較爽,但是相互之間顯然是不便於交流,於是乙個叫做iso的國際標準化組織出現了,他們制訂了一種統一的編碼規則來進行字元編碼,這種編碼規則用兩個位元組表示乙個字元,而ascii字元只用了乙個位元組,那就在前乙個全部補零,這樣一來,全世界的編碼規則就統一了,這種編碼規則就是」universal multiple-octet coded character set」,簡稱 ucs, 俗稱 「unicode」。由於統一用兩個位元組表示乙個字元,所以這種方式又稱為ucs-2。如果這樣還不夠用,iso還準備了usc-4,就是用4個位元組表示乙個字元,這能表示的字元已經遠超過地球上的字元總數了。
與unicode一起到來的還有計算機網路的興起,所以如何在網路上傳遞unicode也是乙個需要考慮的問題。統一地用兩個位元組表示乙個字元雖然比較方便,但是對於英文來說卻造成了極大的浪費,因為它們的第乙個位元組永遠是全零,所以面向傳輸和儲存的眾多utf(ucs transfer format)出現了,即變長的usc,我們熟知的utf-8即按8位為單位傳輸資料。
所以需要注意的是,ucs(unicode character set)還僅僅是字元對應碼位的一張表而已,比如」漢」這個字的碼位是6c49。字元具體如何傳輸和儲存則是由utf(ucs transformation format)來負責。
另外,unicode與utf-8之間的轉換比較麻煩。
python中的字串物件有兩種,即str與unicode,但是嚴格來說,str應該是位元組串,它是unicode經過編碼之後形成的位元組序列,unicode才是真正意義上的字串。而python中的編碼(encode)就是unicode->str,解碼(decode)就是str->unicode。
宣告:
s = 『中文『 s = u『中文『.encode(『utf-8『) >>>type(『中文『) 求長度:
>>>u『中文『.encode(『utf-8『) 『\xe4\xb8\xad\xe6\x96\x87『 >>> len(u『中文『.encode(『utf-8『)) 6
宣告:s = u『中文『 s = 『中文『.decode(『utf-8『) s = unicode(『中文『, 『utf-8『) >>> type(u『中文『) 求長度:
>>> u『中文『 u『\u4e2d\u6587『 >>> len(u『中文『) 2
在記憶體中表示是統一用的unicode碼,而在儲存和傳輸時,則會用相應的utf-x碼
coding:utf-8表示的是這個python檔案的編碼方式,如果你的指令碼檔案中出現了如漢字之類的非英語字元,那麼你就需要考慮在檔案的開頭註明檔案的編碼方式了。
而sys.setdefaultencoding表示的是python預設的編碼解碼方式,當你在python中進行編碼和解碼的時候,如果沒有明確指明解碼方式,那麼就會用setdefaultencoding。比如
#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中國' #注意這裡的'中國'是str型別的,而不是unicode型別
s.encode('gb18030')
這裡是將s重新編碼成gb18030,即unicode->str,而s是str,所以要先從str解碼成unicode,再從unicode編碼成gb18030。解碼的工作由python自動進行,由於我們沒有指明解碼的方式,所以這是python會用setdefaultencoding中預設的方式進行解碼,由於我們檔案的編碼方式是utf-8,所以』中國』的編碼方式也是utf-8,如果setdefaultencoding中預設的編碼方式不是utf-8,那麼就會報錯。當然,我們也可以自己指定解碼方式,如
s.decode('utf-8').encode('gb18030')
str與unicode
coding:utf-8與sys.setdefaultencoding
字元編譯碼的故事
python字元編碼詳解
setdefaultencoding
python中的字元編碼問題
總結python的字元編碼 應該在 最初兩行內包含 usr bin env python coding utf 8 獲得 設定系統的預設編碼 sys.getdefaultencoding sys.setdefaultencoding utf 8 獲得檔案系統的檔名的編碼 sys.getfilesys...
python中的字元編碼問題
ascii碼和字元之間的轉換 gbk2312 6700多漢字 gbk1.0 1995年推出,20000餘漢字 gbk18030 2000年推出,27000餘漢字 unicode 統一碼 萬國碼 單一碼 是電腦科學領域裡的一項業界標準,包括字符集 編碼方案等。unicode 是為了解決傳統的字元編碼方...
python的字元編碼問題
最近因為專案需要用到python指令碼,趕緊學習了一下。今天碰到乙個問題,做下筆記。就是出現類似 non utf 8 code starting with xb6 in file xx.py 這樣的報錯,錯誤原因網上都有解釋 是python的檔案編碼問題,因此根據官方提示,需要加入 coding 你...