漢字編碼問題是困擾工程師們的一大難題,在最近做的spider項(xiàng)目中,遇到了不少相關(guān)的麻煩,于是花了一些時(shí)間來研究了一下python的字符編碼的問題.
1.程序內(nèi)的編碼問題
在沒有聲明默認(rèn)編碼方式的情況下,python使用ASCII字符來編碼,也就是說,默認(rèn)只支持ASCII從0-127這128個(gè)字符,其他非拉丁的字符,如漢字,希伯來語,日語韓語等語言的字符是沒有辦法顯示的,在讀取或者在程序的字符串中出現(xiàn)的時(shí)候,會(huì)出現(xiàn)報(bào)錯(cuò)的情況,這個(gè)時(shí)候,需要指定默認(rèn)字符集來解決這個(gè)問題
可以使用:
#-*- coding: UTF-8 -*-
也可以使用:
# coding: UTF-8
在文件的開頭(import)的前面來表明程序所使用的字符集,(utf-8可以換成其他字符集如有需要如GBK,big5,latin等等
2.有關(guān)字符集的問題
在計(jì)算機(jī)出現(xiàn)的早期,使用的字符集是舊版的ASCII字符集,在這種字符集中,使用7位表示一個(gè)字符,相應(yīng)的,共128個(gè)可用的字符.后來,ASCII標(biāo)準(zhǔn)擴(kuò)展到8位,同時(shí)支持一些其他拉丁語族的語言如法語西班牙語中不同于拉丁文的字符,同時(shí)包括了希臘文,還有一些其他字符如積分號(hào)等等.
但是仍然不夠,亞洲,非洲有大量的非拉丁語族,希臘語族語言,并且很多使用字符文字而不是字母文字,這就造成了更大的麻煩。人們?yōu)榱私鉀Q這個(gè)問題,就發(fā)明了針對(duì)不同文字的字符集,比如漢字的GB2312,GBk,繁體字的BIG5,ISO8859,還有如Latin等其他編碼方式,這些編碼方式規(guī)定了一定的數(shù)值映射到不同的字符上面。
但是這也造成了一定的困難,就是,相同的編碼,用不同的字符集解釋,變成了不同的字符,于是出現(xiàn)了б?ЯАзЪСЯ"、"?????????之類的令人生畏的亂碼
于是人們?cè)俅翁岢隽私鉀Q方案,那就是unicode編碼,unicode是一個(gè)類的編碼方式,但是都具有一個(gè)特點(diǎn),就是一個(gè)編碼對(duì)應(yīng)唯一字符,防止解釋成為不同字符。
3.UTF-8編碼
現(xiàn)在最常用,也是國(guó)際通行的標(biāo)準(zhǔn)是unicode 8 也稱為 UTF-8編碼,基本編碼方式如下
使用一至六個(gè)字節(jié)為每個(gè)字符編碼(盡管如此,2003年11月UTF-8被RFC 3629重新規(guī)范,只能使用原來Unicode定義的區(qū)域,U+0000到U+10FFFF,也就是說最多四個(gè)字節(jié)):
128個(gè)US-ASCII字符只需一個(gè)字節(jié)編碼(Unicode范圍由U+0000至U+007F)。
帶有附加符號(hào)的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個(gè)字節(jié)編碼(Unicode范圍由U+0080至U+07FF)。
其他基本多文種平面(BMP)中的字符(這包含了大部分常用字,如大部分的漢字)使用三個(gè)字節(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是一種變長(zhǎng)編碼,也就是不能一個(gè)一個(gè)字節(jié)來讀,來解釋的。UTF-8是ASCII的一個(gè)。因?yàn)橐粋€(gè)純ASCII字符串也是一個(gè)合法的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í)必須指定字符集