非英文本元編譯碼及其在Python中的應用

2021-09-11 22:23:11 字數 2530 閱讀 6565

關於編譯碼:

在計算機中,所有的字元都是以0、1的二進位制的形式儲存的。如何把乙個字元轉換成二進位制這個過程就叫做編碼,反過來如何把計算機中的二進位制還原成乙個字元叫做解碼。

由此我們可以知道,要想正確的解碼,必須知道是用什麼規則編碼的。假如我們有一種規則叫ascii,在這種規則下字元『a』會被儲存為01100001,那麼解碼時如果按照這種規則解碼就能夠解出『a』,但是如果按照其他規則解碼,可能就解出來奇怪的字元了,這時就會出現亂碼。

我們經常聽說的ascii、utf8、gbk等等都是不同的規則。這樣的規則有很多很多,但是在這些規則中,英文本元的編碼往往都是一致的,而中文或日文則有的規則不支援,即使支援的規則各自定義也不同,所以會出現英文不容易出現亂碼,而中文、日文字元不匹配時容易出現亂碼。

編碼分成兩部分,一部分叫做字符集,規定了在這個規則裡面,id和字元的對應關係。常見的字符集包括ascii,unicode等,比如我們都熟悉ascii碼表中的48號對應的字元是『0』。另一部分是規則,主要規定的是用幾位來表示字元,如何表示字元。比如utf8和utf16,字符集都是unicode,但是字長的定義不同,因此最後編碼產生的結果也不同。

常見的編碼格式:

ascii:

最早計算機使用在英語國家,而英文本元數量很少,在20世紀60年代,美國制定一套字元編碼,對英語字元與二進位制位之間的關係做統一規定,被稱為ascii碼沿用至今。

ascii碼規定了128個字元的編碼(包括32個不能列印出來的控制符號),只占用了乙個位元組的後面7位,最前面的1位統一規定為0。

在我們程式設計使用的

python 2.7

中,預設的

string

的編碼方式是

ascii碼。

unicode:

隨著計算機的發展,各種語言文字都要進行計算機的編譯碼,ascii碼顯然不滿足不同國家的不同需求。各個國家自行定義自己的字符集,會導致互相解碼失敗,出現亂碼。如果有一種編碼,將世界上所有的符號都納入其中。每乙個符號都給予乙個獨一無二的編碼,那麼亂碼問題就會消失。於是就產生了unicode,這是一種對所有語言和符號的編碼。unicode當然是乙個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣,比如,u+0639表示阿拉伯字母ain,u+0041表示英語的大寫字母a,u+4e25表示漢字"嚴"。

要注意的是,unicode只是個符號集,只規定了符號的二進位制**,沒有規定這個二進位制**應如何儲存。比如,漢字"嚴"的unicode是0x4e25(100111000100101),也就是說這個符號的表示至少需要2個位元組。而其他字元可能需要更多位元組。

這就有兩個問題,第一,計算機如何知道三個位元組都表示同一符號,而不是分別表示三個符號?第二,如果統一規定每個符號用三個或四個位元組表示,那麼對於儲存來說是極大的浪費,文字檔案的大小會因此大出二三倍,這是無法接受的。

它們造成的結果是:1)出現了unicode的多種儲存方式,也就是說有許多種不同的二進位制格式,可以用來表示unicode。2)unicode在很長一段時間內無法推廣。

utf-8:

utf-8是unicode最常見的實現方式之一。utf-8是一種變長的編碼方式,使用1-4個位元組表示乙個符號,根據不同的符號而變化位元組長度。

它的編碼規則很簡單:

1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,utf-8編碼和ascii碼是相同的。

2)對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

cp936cp932cp437:

codepage,又叫程式碼頁,是用來反映各國的文字編碼與unicode的對映關係的。在windows系統下,cmd命令列中輸入chcp命令,就能獲取當前系統的預設codepage。

目前windows中,中文系統對應的codepage是936,日文系統對應的codepage是932,英文系統對應的codepage是437。windows核心是unicode編碼的,但是為了本地化的顯示,使用不同的codepage來顯示和輸入。utf-8的codepage是65001。

python (v2.7)中的應用

在python2.7中,為了在不同語言的作業系統的電腦上都能顯示無亂碼,需要注意的是,首先改變程式的預設編碼規則為utf-8,注意程式中的string預設是ascii碼,為了儲存非英文本元,應當統一轉換成utf-8處理。

當輸出到作業系統時,由於utf-8與系統預設的編碼格式可能不相容,因此需要把字串轉換成unicode,讓作業系統根據自身codepage進行處理,這樣才能夠使得非英文本元無亂碼。

匹配漢字英文本元

2012 12 07 18 23 7639人閱讀收藏 舉報匹配中文 u4e00 u9fa5 英文本母 a za z 數字 0 9 匹配中文,英文本母和數字及 u4e00 u9fa5 a za z0 9 同時判斷輸入長度 u4e00 u9fa5 a za z0 9 w u4e00 u9fa5 uf90...

string中英文本元

在c 中字串類的string的模板原型是basic string template class elem,class traits char traits elem class ax allocator elem class basic string 第乙個引數 elem表示型別。第二個引數trai...

中英文本串中統計英文本元個數

工作中遇到如下問題,搜尋網路資源得以解決,記錄以供參考。問題 在一段中英文混合的字串中,通過關關鍵字查詢到某位置p。需要擷取p前後一定長度字元,構成乙個新的字串。問題解析 由於是中貢混合的字串,當向前後擷取長度不當時會出現擷取到中文半個字的情況。面引起出現亂碼的情況。方法 首先確定字串的編碼格式,由...