字符集和編碼

2021-09-22 11:22:47 字數 2213 閱讀 6526

今天被乙個python編碼問題折騰了半下午。編碼問題一直是個讓人比較糾結的問題,寫這篇文章想簡單的總結下python中一些常見的編碼問題以及解決方式。這是第一篇,先總結下字符集和編碼的一些基本概念和內容。

當中ascii標準本身就規定了字元和字元編碼方式,採用單位元組編碼,總共能夠編碼128個字元,如空格的編碼是32。小寫字母a是97,所以ascii既是字符集又是編碼方案。

對於英文來說,128個符號編碼已經夠用了,然而對於其它語言比方中文,顯然就不夠了。

因此就出現了多位元組字符集mbcs(multi-byte character set)。如gb2312,gbk,gb18030,big5等編碼都屬於mbcs。

由於mbcs大都使用2個位元組編碼,所以有時候也叫dbcs(double-byte character set)。

我們在linux系統中看到含有中文的檔案編碼經常是cp936,那這個事實上就是gbk編碼了,這個名字的由來是由於ibm以前發明了乙個code page的概念,把這些多位元組編碼收入當中,gbk編碼正好位於936頁,所以就簡稱cp936了。

而後大家認為各種編碼太多不方便,不如全部語言字元都使用一套字符集來表示。於是就出現了unicode。

unicode/ucs(unicode character set)標準僅僅是乙個字符集標準,可是它並沒有規定字元的儲存和傳輸方式。

unicode是一種字符集而不是詳細的編碼,它主要有3種編碼方式:最初unicode標準使用2個位元組表示乙個字元。編碼方案是utf-16,還有使用4個位元組表示乙個字元的編碼方案utf-32。而後來使用英文本元的國家認為不好,原來乙個字元儲存的如今變成了2個字元。空間增大了一倍,由此utf-8編碼。utf-8編碼中。英文佔乙個位元組,中文佔3個位元組。

如上面所提到的,unicode字符集主要採用utf-8,utf-16等方式進行編碼儲存。當然,gbk等字元編碼也能夠編碼unicode全部的字符集,也算是unicode的一種字元編碼。那麼這種話。計算機怎樣知道檔案採用哪種方式編碼呢?unicode規範中又定義,在每乙個檔案最前面增加乙個表示編碼順序的字元bom(byte order mark)。比方石鍋拌飯中的「石」的utf-16編碼是77f3,採用utf-16方式儲存使用2個位元組,乙個位元組是77,乙個位元組是f3.儲存的時候假設77在前面,f3在後面。則稱為big endian方式。反之,則是little endian方式。。這個字元正好也是2個位元組。為feff。假設乙個文字檔案頭兩個位元組威feff,則表示採用big endian方式編碼;否則就是little endian方式。

而utf-8的bom是efbbbf,總結例如以下:

bom_utf8 '\xef\xbb\xbf' 

bom_utf16_le '\xff\xfe'

bom_utf16_be '\xfe\xff'

並非全部的編輯器都會寫入bom。但即使沒有bom,unicode還是能夠讀取的,僅僅是須要指定編碼,不然可能會失效。

此外另一種不得不提的是ansi,ansi在windows系統中極為常見,事實上ansi是windows code pages,這個模式依據當前的locale選定詳細編碼,假設系統locale是中文簡體則採用gbk編碼,正體中文為big5編碼,日文則是jis編碼。

此外windows中喜歡把bom_utf16_le編碼稱作unicode,把bom_utf8稱作utf-8。也有人說utf-8不須要bom來標示,事實上是不多的。這是由於編輯器一般預設使用utf-8來測試字元編碼而已,假設能夠成功解碼。就用utf-8進行解碼。即便最開始採用的是ansi儲存的,開啟檔案時還是最先使用utf-8來解碼。比方你用windows的記事本程式新建乙個檔案,寫入「奼塧」並用ansi編碼儲存。再次開啟檔案,會發現「奼塧」會變成「漢a」。

還是以石鍋拌飯的「石」字來看看在windows以下各種編碼方式下的編碼吧。

開啟windows的記事本程式,分別用ansi。unicode(實際是bom_utf16_le),unicode big endian。utf-8這幾種編碼方式看看終於是否跟之前分析的一樣。

這裡使用ultraedit來檢視16進製制編碼,能夠開啟「編輯」-》16進製制編輯功能來檢視。

ansi編碼儲存,編碼是ca af。這也表示gbk編碼儲存也採用了big endian方式。

unicode編碼儲存,編碼是ff fe f3 77。 

unicode big endian編碼儲存,編碼是 fe ff 77 f3。 

utf-8編碼儲存。編碼是ef bb bf e7 9f b3。

字符集和字符集編碼詳解

gb2312 gbk ascii asni unicode utf 8等等,這些字眼非常常見,同時帶來許多的問題。本文只是從理解的角度,說明以上內容的不同含義從而達到區分其用法的目的是夠了的。至於實現方式,可以查閱各自的詳細標準官方文件。先解釋乙個概念,什麼是字符集,嗯,不解釋了,我弄乙個吧 從今以...

字符集和編碼

什麼是字元?字元就是文字和符號的統稱,字符集就是多個字元的集合,字符集有很多種,常見的有ascii,gb2312,unicode字符集。什麼是編碼?計算機要準確的處理字符集中的文字,就需要對字元進行編碼。對unicode字符集編碼的叫做unicode編碼,對ascii字符集編碼叫做ascii編碼。a...

編碼和字符集

ascii unicode gb2312等都是字符集,用於定義編號指代的字元。utf 8,utf 16則是unicode的編碼格式。ascii ascii只有128個,能表示英文 數字 常用符號。gb2312 gb2312是中文特有的字符集,有2萬多個字元,前128個和ascii保持一致,因此能相容...