02. Python 中文亂碼問題處理以及常用的編碼

目錄

常用編碼介紹

=> ASCII

=> IOS8859-1

=> GB2312

=> GBK

=> GB18030

=> Unicode(萬國碼)

=> UTF-8

中文亂碼問題


常用編碼介紹

在操作文本文件時, 經常會操作中文, 這時候就經常會碰到亂碼問題;

=> ASCII

全稱爲American Standard Code for Information Interchange , 美國信息交換標準代碼, 這是世界上最早最通用的單字節編碼系統, 主要用來顯示現代英語及其他西歐語言;

ASCII碼用7位表示, 只能表示128個字符(英語26個字母足夠了); 只定義了27=128個字符, 用7bit即可完全編碼, 而一字節8bit的容量256, 所以一字節ASCII的編碼最高位總是0 ;

0~31表示控制字符如回車, 退格, 刪除等; 21~126表示打印字符即可以通過鍵盤輸入並且能顯示出來的字符; 其中48~57位0到9十個阿拉伯數字, 65~90爲26個大寫英文字母, 97~122爲26個小寫英文字母, 其餘爲一些標點符號, 運算符號等; 具體可以參考ASCII標準表( 細節見百度 );

=> IOS8859-1

ISO-8859-1又稱Latin-1, 是一個8位單字節字符集, 它把ASCII的最高位也利用起來, 併兼容了ASCII, 新增的空間是128(共256個字符), 但它並沒有完全用完;

在ASCII編碼之上又增加了西歐語言, 希臘語, 泰語, 阿拉伯語, 希伯來語對應的文字符號, 它是向下兼容ASCII編碼;

=> GB2312

GB2312 全稱爲信息交換用漢字編碼字符集,是中國於 1980 年發佈,主要用於計算機系統中的漢字處理。GB2312 主要收錄了 6763 個漢字、682 個符號。

GB2312覆蓋了漢字的大部分使用率,但不能處理像古漢語等特殊的罕用字,所以後來出現了像 GBK、GB18030 這種編碼。

GB2312 完全兼容 ISO8859-1。

=> GBK

全稱爲 Chinese Internal Code Specification,即漢字內碼擴展規範,於 1995 年制定。

它主要是擴展了 GB2312,在它的基礎上又加了更多的漢字,它一共收錄了 21003 個漢字

=> GB18030

現在最新的內碼字集於 2000 年發佈,並於 2001 年強制執行,包含了中國大部分少數民族的語言字符,收錄漢字數超過 70000 餘個。

它主要採用單字節、雙字節、四字節對字符編碼,它是向下兼容 GB2312 和 GBK 的,雖然是我國的強制使用標準,但在實際生產中很少用到,用得最多的反而是 GBK 和 GB2312 ;

=> Unicode(萬國碼)

Unicode 編碼設計成了固定兩個字節,所有的字符都用 16 位(2^16=65536) 表示,包括之前只佔 8 位的英文字符等,所以會造成空間的浪費,UNICODE 在很長的一段時間內都沒有得到推廣應用。

Unicode 完全重新設計,不兼容 iso8859-1,也不兼容任何其他編碼。

=> UTF-8

對於英文字母,unicode 也需要兩個字節來表示。所以 unicode 不便

於傳輸和存儲。因此而產生了 UTF 編碼,UTF-8 全稱是(8-bit Unicode

Transformation Format)。

UTF 編碼兼容 iso8859-1 編碼,同時也可以用來表示所有語言的字符,

不過,UTF 編碼是不定長編碼,每一個字符的長度從 1-4 個字節不等。其中,

英文字母都是用一個字節表示,而漢字使用三個字節

【老鳥建議】一般項目都會使用 UTF-8。unicode 中雖然漢字是兩個字節,

UTF-8 中漢字是 3 個字節。但是互聯網中一個網頁也包含了大量的英文字母,

這些英文字母只佔用 1 個字節,整體佔用空間,UTF-8 仍然小於 Unicode ;

中文亂碼問題

windows 操作系統默認的編碼是 GBK,Linux 操作系統默認的編碼是 UTF-8。當我們用 open()時,調用的是操作系統打開的文件,默認的編碼是 GBK;     

亂碼只存在中文之間, 就是中文解碼和編碼的編碼不一致; 必須保持一致;

#文本寫入操作亂碼測試
f = open("a.txt","a",encoding="utf-8")  #可以直接規定編碼格式
s = "好好學習\n天天向上\n";
f.write(s)
f.close()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章