python學習筆記之字串編碼(「UTF 8」)

2021-10-01 08:26:37 字數 3258 閱讀 3472

先介紹一下編碼發展歷史

說到字元編碼,要從計算機的誕生開始講起,計算機發明於美國,在英語世界裡,常用字元非常有限,26個字母(大小寫)、10個數字、標點符號、控制符,這些字元在計算機中用乙個位元組的儲存空間來表示綽綽有餘,因為乙個位元組相當於8個位元位,8個位元位可以表示256個符號。於是美國國家標準協會ansi制定了一套字元編碼的標準叫 ascii(american standard code for information interchange),每個字元都對應唯一的乙個數字,比如字元 「a」 對應數字是65,「b」 對應 66,以此類推。最早 ascii 只定義了128個字元編碼,包括96個文字和32個控制符號,一共128個字元只需要乙個位元組的7位就能表示所有的字元,因此 ascii 只使用了乙個位元組的後7位,剩下最高位1位元被用作一些通訊系統的奇偶校驗。ascii表可以自行在網上搜尋

然而計算機慢慢地普及到其他西歐地區時,發現還有很多西歐字元是 ascii 字符集中沒有的,顯然 ascii 已經沒法滿足人們的需求了,好在 ascii 字元只用了位元組的7位 0×00~0x7f 共128個字元,於是他們在 ascii 的基礎上把原來的7位擴充到8位,把0×80-0xff這後面的128個數字利用起來,叫 eascii ,它完全相容ascii,擴充套件出來的符號包括**符號、計算符號、希臘字母和特殊的拉丁符號。然而 eascii 時代是乙個混亂的時代,各個廠家都有自己的想法,大家沒有統一標準,他們各自把最高位按照自己的標準實現了自己的一套字元編碼標準,比較著名的就有 cp437 , cp437 是 始祖ibm pc、ms-dos使用的字元編碼

眾多的 ascii 擴充字符集之間互不相容,這樣導致人們無法正常交流,例如200在cp437字符集表示的字元是 è ,在 iso/8859-1 字符集裡面顯示的就是 ╚,於是國際標準化組織(iso)及國際電工委員會(iec)聯合制定的一系列8位字符集的標準 iso/8859-1(latin-1) ,它繼承了 cp437 字元編碼的128-159之間的字元,所以它是從160開始定義的,iso-8859-1在 cp437 的基礎上重新定義了 160~255之間的字元。

ascii 字元編碼是單位元組編碼,計算機進入中國後面臨的乙個問題是如何處理漢字,對於拉丁語系國家來說通過擴充套件最高位,單位元組表示所有的字元已經綽綽有餘,但是對於亞洲國家來說乙個位元組就顯得捉襟見肘了。於是中國人自己弄了一套叫 gb2312 的雙位元組字元編碼,又稱gb0,1981 由中國國家標準總局發布。gb2312 編碼共收錄了6763個漢字,同時他還相容 ascii,gb 2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率,不過 gb2312 還是不能100%滿足中國漢字的需求,對一些罕見的字和繁體字 gb2312 沒法處理,後來就在gb2312的基礎上建立了一種叫 gbk 的編碼,gbk 不僅收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。同樣 gbk 也是相容 ascii 編碼的,對於英文本元用1個位元組來表示,漢字用兩個位元組來標識。

gbk僅僅只是解決了我們自己的問題,但是計算機不止是美國人和中國人用啊,還有歐洲、亞洲其他國家的文字諸如日文、韓文全世界各地的文字加起來估計也有好幾十萬,這已經大大超出了ascii 碼甚至gbk 所能表示的範圍了,雖然各個國家可以制定自己的編碼方案,但是資料在不同國家傳輸就會出現各種各樣的亂碼問題。如果只用一種字元編碼就能表示地球甚至火星上任何乙個字元時,問題就迎刃而解了。是它,是它,就是它,我們的小英雄,統一聯盟國際組織提出了unicode 編碼,unicode 的學名是"universal multiple-octet coded character set",簡稱為ucs。它為世界上每一種語言的每乙個字元定義了乙個唯一的字元碼,unicode 標準使用十六進製制數字表示,數字前面加上字首 u+,比如字母『a』的unicode編碼是 u+0041,漢字『中』的unicode 編碼是u+4e2d

unicode有兩種格式:ucs-2和ucs-4。ucs-2就是用兩個位元組編碼,一共16個位元位,這樣理論上最多可以表示65536個字元,不過要表示全世界所有的字元顯示65536個數字還遠遠不過,因為光漢字就有近10萬個,因此unicode4.0規範定義了一組附加的字元編碼,ucs-4就是用4個位元組(實際上只用了31位,最高位必須為0)。理論上完全可以涵蓋一切語言所用的符號。

但是 unicode 有一定的侷限性,乙個 unicode 字元在網路上傳輸或者最終儲存起來的時候,並不見得每個字元都需要兩個位元組,比如字元「a「,用乙個位元組就可以表示的字元,偏偏還要用兩個位元組,顯然太浪費空間了。

第二問題是,乙個 unicode 字元儲存到計算機裡面時就是一串01數字,那麼計算機怎麼知道乙個2位元組的unicode字元是表示乙個2位元組的字元呢,例如「漢」字的 unicode 編碼是 u+6c49,我可以用4個ascii數字來傳輸、儲存這個字元;也可以用utf-8編碼的3個連續的位元組e6 b1 89來表示它。關鍵在於通訊雙方都要認可。因此unicode編碼有不同的實現方式,比如:utf-8、utf-16等等。unicode就像英語一樣,做為國與國之間交流世界通用的標準,每個國家有自己的語言,他們把標準的英文文件翻譯成自己國家的文字,這是實現方式,就像utf-8。

utf-8(unicode transformation format)作為 unicode 的一種實現方式,廣泛應用於網際網路,它是一種變長的字元編碼,可以根據具體情況用1-4個位元組來表示乙個字元。比如英文本元這些原本就可以用 ascii 碼表示的字元用utf-8表示時就只需要乙個位元組的空間,和 ascii 是一樣的。對於多位元組(n個位元組)的字元,第乙個位元組的前n為都設為1,第n+1位設為0,後面位元組的前兩位都設為10。剩下的二進位制位全部用該字元的unicode碼填充。

以「好」為例,」好「對應的 unicode 是597d,對應的區間是 0000 0800–0000 ffff,因此它用 utf-8 表示時需要用3個位元組來儲存,597d用二進位制表示是: 0101100101111101,填充到 1110***x 10****** 10****** 得到 11100101 10100101 10111101,轉換成16進製制是 e5a5bd,因此」好「的 unicode 碼 u+597d 對應的 utf-8 編碼是 「e5a5bd」。

控制台的b表示二進位制。abc是pycharm給我們看的,其實編碼之後我們是看不懂這個**的,只有解碼之後才能看懂。

Python 學習筆記之字串

python字串格式化符號 符 號 描述 c 格式化字元及其ascii碼 s格式化字串 d格式化整數 u格式化無符號整型 o格式化無符號八進位制數 x格式化無符號十六進製制數 x格式化無符號十六進製制數 大寫 f格式化浮點數字,可指定小數點後的精度 e用科學計數法格式化浮點數 e作用同 e,用科學計...

python筆記之字串

簡介 以下表示都為str型別,即字串 str1 i love you str2 i love you python三引號允許乙個字串跨多行,字串中可以包含換行符 製表符以及其他特殊字元 str3 i love you print type str1 print type str2 print typ...

Python 學習筆記 字串

今天學習python對字串的一些基礎處理,感覺對於工作中的自動化指令碼傳送cli命令會很有幫助。首先最重要的是 標稱 轉換說明符 conversion specifier 用於字串格式化。左側放置乙個字串 格式化字串 而右側放置希望被格式化的值 待格式化的值 1 2 3 4 5 left hello...