漢字編碼問題是困擾工程師們的一大難題,在最近做的spider項(xiàng)目中,遇到了不少相關(guān)的麻煩,于是花了一些時(shí)間來研究了一下python的字符編碼的問題.
1.程序內(nèi)的編碼問題
在沒有聲明默認(rèn)編碼方式的情況下,python使用ASCII字符來編碼,也就是說,默認(rèn)只支持ASCII從0-127這128個字符,其他非拉丁的字符,如漢字,希伯來語,日語韓語等語言的字符是沒有辦法顯示的,在讀取或者在程序的字符串中出現(xiàn)的時(shí)候,會出現(xiàn)報(bào)錯的情況,這個時(shí)候,需要指定默認(rèn)字符集來解決這個問題
可以使用:
#-*- coding: UTF-8 -*-
也可以使用:
# coding: UTF-8
在文件的開頭(import)的前面來表明程序所使用的字符集,(utf-8可以換成其他字符集如有需要如GBK,big5,latin等等
2.有關(guān)字符集的問題
在計(jì)算機(jī)出現(xiàn)的早期,使用的字符集是舊版的ASCII字符集,在這種字符集中,使用7位表示一個字符,相應(yīng)的,共128個可用的字符.后來,ASCII標(biāo)準(zhǔn)擴(kuò)展到8位,同時(shí)支持一些其他拉丁語族的語言如法語西班牙語中不同于拉丁文的字符,同時(shí)包括了希臘文,還有一些其他字符如積分號等等.
但是仍然不夠,亞洲,非洲有大量的非拉丁語族,希臘語族語言,并且很多使用字符文字而不是字母文字,這就造成了更大的麻煩。人們?yōu)榱私鉀Q這個問題,就發(fā)明了針對不同文字的字符集,比如漢字的GB2312迁沫,GBk,繁體字的BIG5捌蚊,ISO8859集畅,還有如Latin等其他編碼方式,這些編碼方式規(guī)定了一定的數(shù)值映射到不同的字符上面缅糟。
但是這也造成了一定的困難挺智,就是,相同的編碼窗宦,用不同的字符集解釋赦颇,變成了不同的字符,于是出現(xiàn)了б?ЯАзЪСЯ"赴涵、"?????????之類的令人生畏的亂碼
于是人們再次提出了解決方案媒怯,那就是unicode編碼,unicode是一個類的編碼方式髓窜,但是都具有一個特點(diǎn)扇苞,就是一個編碼對應(yīng)唯一字符欺殿,防止解釋成為不同字符。
3.UTF-8編碼
現(xiàn)在最常用鳖敷,也是國際通行的標(biāo)準(zhǔn)是unicode 8 也稱為 UTF-8編碼脖苏,基本編碼方式如下
使用一至六個字節(jié)為每個字符編碼(盡管如此,2003年11月UTF-8被RFC 3629重新規(guī)范定踱,只能使用原來Unicode定義的區(qū)域棍潘,U+0000到U+10FFFF,也就是說最多四個字節(jié)):
128個US-ASCII字符只需一個字節(jié)編碼(Unicode范圍由U+0000至U+007F)崖媚。
帶有附加符號的拉丁文亦歉、希臘文、西里爾字母至扰、亞美尼亞語鳍徽、希伯來文、阿拉伯文敢课、敘利亞文及它拿字母則需要兩個字節(jié)編碼(Unicode范圍由U+0080至U+07FF)。
其他基本多文種平面(BMP)中的字符(這包含了大部分常用字绷杜,如大部分的漢字)使用三個字節(jié)編碼(Unicode范圍由U+0800至U+FFFF)直秆。
其他極少使用的Unicode 輔助平面的字符使用四至六字節(jié)編碼(Unicode范圍由U+10000至U+1FFFFF使用四字節(jié),Unicode范圍由U+200000至U+3FFFFFF使用五字節(jié)鞭盟,Unicode范圍由U+4000000至U+7FFFFFFF使用六字節(jié))圾结。
注意,utf-8是一種變長編碼齿诉,也就是不能一個一個字節(jié)來讀筝野,來解釋的虑乖。UTF-8是ASCII的一個皂冰。因?yàn)橐粋€純ASCII字符串也是一個合法的UTF-8字符串,所以現(xiàn)存的ASCII文本不需要轉(zhuǎn)換滔吠。為傳統(tǒng)的擴(kuò)展ASCII字符集設(shè)計(jì)的軟件通车至担可以不經(jīng)修改或很少修改就能與UTF-8一起使用焕议。
4.python的str和unicode的問題
這兩者有什么區(qū)別呢?
str是字符組成的序列
unicode 是unicode編碼單元字節(jié)組成的序列
兩者的相互轉(zhuǎn)換關(guān)系
str decode成為unicode
unicode encode成為str
s="abc"
print type(s)
c=s.decode()
print type(c)
得到結(jié)果
<type 'str'>
<type 'unicode'>
注意轉(zhuǎn)換時(shí)必須指定字符集