python中亂碼問題是乙個很頭痛的問題。
在python3中,對中文進行了全面的支援,但在python2.x中需要進行相關的設定才能使用中文。否則會出現亂碼
python預設採取的ascii編碼,字母、標點和其他字元只使用乙個位元組來表示
對於中文字元來說,gbk編碼下乙個中文佔兩個位元組,utf-8編碼下乙個中文佔三個位元組
python 2.7.11 (v2.7.11:6d1b6a68f775, dec 5 2015, 20:40:30) [msc v.1500 64 bit (
amd64)] on win32
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
中文計算機系統中的中文編碼一般有gbk(相容gb2312)和utf-8兩種。如果中文編碼和ascii混合使用的話,就會導致解碼錯誤,從而才生亂碼。而cmd下預設的編碼方式為:gbk,所以會導致亂碼!
為了將各種不同的語言包含在統一的字符集中,滿足國際間的資訊交流,國際上制訂了一張通用的字元錶即unicode字符集,包含了世界上所有語言字元,這些字元具有唯一的編碼,通過使用unicode字符集可以滿足跨語言的文書處理,避免亂碼的產生。
其中utf-8就是基於unicode字符集的碼點處理後的一種編碼。
i)互動式命令中:一般不會出現亂碼,無需做處理
ii).py指令碼檔案中:跨字符集必須做設定,否則亂碼。
如下面三種:都可以
#coding=utf-8
#coding:utf-8
#_*_ coding:utf-8 _*_
可以檢視下的解釋
粗略的看下:
這個pep的目的是介紹在乙個python原始檔中如何宣告編碼的語法。隨後python直譯器會在解釋檔案的時候用到這些編碼資訊。最顯著的是原始檔中對unicode的解釋,使得在乙個能識別unicode的編輯器中使用如fut-8編碼成為可能
如果在python中我們並沒有宣告別的編碼方式,就是以ascii編碼作為標準編碼方式的
定義原始檔的編碼方式的宣告應當被放在這個檔案的第一行或者是第二行例如:
#coding=
或者(使用流行編輯器中的格式化方式)
#!/usr/bin/python
# _*_ coding: _*_
或者
# vim: set fileencoding=:
不管怎麼樣,這些在第一行或者第二行的宣告都要符合正規表示式
"coding[:=]\s*([-\w.]+)"
所以我們就可以知道為什麼使用冒號或者等號都可以了,如果宣告的編碼python不能識別就會報錯
上面的設定是對原始檔編碼方式的宣告
還需要注意的是
在儲存的時候選擇儲存為utf-8格式。
如果是用notpad文字編輯器開啟,選擇【另存為】-->utf-8即可
其他編輯器找到相應編碼方式選擇utf-8
以上設定仍然不能保證能輸出正常輸出中文
不同的編輯器,如vim,idle,eclipse,cmd使用的輸出編碼都是不一致的。
所以,在乙個地方能正常輸出中文,在另外乙個地方就未必。所以還必須做編碼解碼設定!
"string".encode("utf-8") #編碼
"string".decode("utf-8") #解碼
如在python2中,得到某個字元的索引:
#!/usr/bin/env python
#_*_encoding:utf-8_*_
a=[1,2,'中',3,4,5,6,7,5,3,'中',4,9,6,5,2,1,'中',7]
pos=0
for i in range(a.count('中')):
if pos==0:
pos=a.index('中')
else:
pos=a.index('中',pos+1)
print ("中的索引:".decode('utf-8')+str(pos))
輸出:
g:\py>python2 test.py
中的索引:2
中的索引:10
中的索引:17
若沒有decode則輸出為:
g:\py>python2 test2.py
涓殑鞝㈠紩:2
涓殑鞝㈠紩:10
涓殑鞝㈠紩:17
在python3中則不需要decode:
#!/usr/bin/env python
#_*_encoding:utf-8_*_
a=[1,2,'中',3,4,5,6,7,5,3,'中',4,9,6,5,2,1,'中',7]
pos=0
for i in range(a.count('中')):
if pos==0:
pos=a.index('中')
else:
pos=a.index('中',pos+1)
print ("中的索引:"+str(pos))
輸出:
g:\py>python34 test2.py
中的索引:2
中的索引:10
中的索引:17
Python編碼問題
tag python,encoding,unicode 現有的字元編碼 ascii,gbk,gb2312,utf 8,unicode.unicode可以用來表示所有語言的字元,而且是定長雙位元組 也有四位元組的 編碼,包括英文本母在內。python中定義乙個unicode字串和定義乙個普通字串一樣簡...
python編碼問題
python裡面基本上要考慮三種編碼格式 1 原始檔編碼 在檔案頭部使用coding宣告。告訴python直譯器該 檔案所使用的字符集。usr bin python coding utf8 2 內部編碼 檔案中的字串,經過decode以後,被轉換為統一的unicode格式的內部資料,類似於u uni...
Python編碼問題
python裡面基本上要考慮三種編碼格式 1 原始檔編碼 在檔案頭部使用coding宣告。告訴python直譯器該 檔案所使用的字符集。usr bin python coding utf8 2 內部編碼 檔案中的字串,經過decode以後,被轉換為統一的unicode格式的內部資料,類似於u uni...