python的漢字編碼原理

漢字編碼問題是困擾工程師們的一大難題,在最近做的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í)必須指定字符集

5.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符集和編碼簡(jiǎn)介 在編程中常??梢砸姷礁鞣N字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 9,091評(píng)論 0 13
  • 飯桌上,最精致的下酒菜,是好奇心。 我:電梯這個(gè)行業(yè),你做了多久? 他:17年。初中畢業(yè)開始的。 我:都說同時(shí)按住...
    GoodNineNine閱讀 710評(píng)論 0 1
  • 一直覺得自己有很嚴(yán)重的強(qiáng)迫癥,對(duì)一切都無比挑剔,吹毛求疵。我一直痛恨會(huì)遲到的人,厭惡著草率敷衍的人,鄙視著不懂裝懂...
    微塵迷離閱讀 218評(píng)論 0 0
  • 今天天氣不錯(cuò) 明天天氣也會(huì)很好 那后天呢?
    Homo_Sapiens閱讀 233評(píng)論 1 1
  • 今天吃過午飯,我坐在炕上(一種農(nóng)村里和床類似的東西)和我老媽邀功請(qǐng)賞:“媽,你看我做的飯好不好吃?” 老媽特別不走...
    顧林深深深閱讀 517評(píng)論 10 6

友情鏈接更多精彩內(nèi)容