python的漢字編碼原理

漢字編碼問題是困擾工程師們的一大難題,在最近做的spider項目中,遇到了不少相關的麻煩,于是花了一些時間來研究了一下python的字符編碼的問題.

1.程序內的編碼問題

在沒有聲明默認編碼方式的情況下,python使用ASCII字符來編碼,也就是說,默認只支持ASCII從0-127這128個字符,其他非拉丁的字符,如漢字,希伯來語,日語韓語等語言的字符是沒有辦法顯示的,在讀取或者在程序的字符串中出現的時候,會出現報錯的情況,這個時候,需要指定默認字符集來解決這個問題
可以使用:
#-*- coding: UTF-8 -*-
也可以使用:
# coding: UTF-8
在文件的開頭(import)的前面來表明程序所使用的字符集,(utf-8可以換成其他字符集如有需要如GBK,big5,latin等等

2.有關字符集的問題

在計算機出現的早期,使用的字符集是舊版的ASCII字符集,在這種字符集中,使用7位表示一個字符,相應的,共128個可用的字符.后來,ASCII標準擴展到8位,同時支持一些其他拉丁語族的語言如法語西班牙語中不同于拉丁文的字符,同時包括了希臘文,還有一些其他字符如積分號等等.

但是仍然不夠,亞洲,非洲有大量的非拉丁語族,希臘語族語言,并且很多使用字符文字而不是字母文字,這就造成了更大的麻煩。人們為了解決這個問題,就發明了針對不同文字的字符集,比如漢字的GB2312,GBk,繁體字的BIG5,ISO8859,還有如Latin等其他編碼方式,這些編碼方式規定了一定的數值映射到不同的字符上面。

但是這也造成了一定的困難,就是,相同的編碼,用不同的字符集解釋,變成了不同的字符,于是出現了б?ЯАзЪСЯ"、"?????????之類的令人生畏的亂碼

于是人們再次提出了解決方案,那就是unicode編碼,unicode是一個類的編碼方式,但是都具有一個特點,就是一個編碼對應唯一字符,防止解釋成為不同字符。

3.UTF-8編碼

現在最常用,也是國際通行的標準是unicode 8 也稱為 UTF-8編碼,基本編碼方式如下

使用一至六個字節為每個字符編碼(盡管如此,2003年11月UTF-8被RFC 3629重新規范,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多四個字節):

  • 128個US-ASCII字符只需一個字節編碼(Unicode范圍由U+0000至U+007F)。

  • 帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個字節編碼(Unicode范圍由U+0080至U+07FF)。

  • 其他基本多文種平面(BMP)中的字符(這包含了大部分常用字,如大部分的漢字)使用三個字節編碼(Unicode范圍由U+0800至U+FFFF)。

  • 其他極少使用的Unicode 輔助平面的字符使用四至六字節編碼(Unicode范圍由U+10000至U+1FFFFF使用四字節,Unicode范圍由U+200000至U+3FFFFFF使用五字節,Unicode范圍由U+4000000至U+7FFFFFFF使用六字節)。

注意,utf-8是一種變長編碼,也就是不能一個一個字節來讀,來解釋的。UTF-8是ASCII的一個。因為一個純ASCII字符串也是一個合法的UTF-8字符串,所以現存的ASCII文本不需要轉換。為傳統的擴展ASCII字符集設計的軟件通常可以不經修改或很少修改就能與UTF-8一起使用。

4.python的str和unicode的問題

這兩者有什么區別呢?

  • str是字符組成的序列

  • unicode 是unicode編碼單元字節組成的序列

兩者的相互轉換關系
str decode成為unicode
unicode encode成為str

s="abc"
print type(s)
c=s.decode()
print type(c)


得到結果

<type 'str'>
<type 'unicode'>

注意轉換時必須指定字符集

5.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 字符集和編碼簡介 在編程中常常可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說...
    蘭山小亭閱讀 8,619評論 0 13
  • 飯桌上,最精致的下酒菜,是好奇心。 我:電梯這個行業,你做了多久? 他:17年。初中畢業開始的。 我:都說同時按住...
    GoodNineNine閱讀 653評論 0 2
  • 一直覺得自己有很嚴重的強迫癥,對一切都無比挑剔,吹毛求疵。我一直痛恨會遲到的人,厭惡著草率敷衍的人,鄙視著不懂裝懂...
    微塵迷離閱讀 201評論 0 0
  • 今天天氣不錯 明天天氣也會很好 那后天呢?
    Homo_Sapiens閱讀 221評論 1 1
  • 今天吃過午飯,我坐在炕上(一種農村里和床類似的東西)和我老媽邀功請賞:“媽,你看我做的飯好不好吃?” 老媽特別不走...
    顧林深深深閱讀 457評論 10 6