用Python實現GB與BIG5碼的轉換

2021-04-13 00:40:06 字數 2030 閱讀 8909

gb碼與big5是中國人常用的兩種編碼集。gb碼為大陸使用,big5為香港與台灣使用。每個編碼都由2個字元構成,高位元組在前,低位元組在後。下面我將使用python實現的編碼轉換的程式向大家作乙個介紹。關於編碼的一些知識大家可以去網上查詢,本人不再贅述。 gb碼是大陸使用的編碼集。以前使用的為gb-2312程式設計,它只有常用字,字數有限。後國家制定了新的gbk編碼,漢字已經達到了2萬多。gbk完全相容原gb-2312編碼,也就是說乙個gb2312的編碼在gbk上是一模一樣的。這裡所介紹的轉換是以gbk為基礎的,因此適用性很廣。gbk編碼中不僅包括了原gb-2312編碼,同時也包括了許多簡碼的繁體碼,同時還有許多的符號與不常用漢字。gbk編碼的範圍是:高位元組從0x81到0xfe,低位元組從0x40到0xfe,同時不包括0x7f。這樣如果我們將其排成乙個矩形,看上去就少了xx7f一根線。

編碼的定位

那麼如何定位乙個gbk碼呢?當我們拿到乙個編碼時,如何判斷是不是乙個gbk碼,如果是gbk碼如何定位它的位置呢?

判斷乙個gbk碼應該比較簡單,我們只要根據它的有效範圍進行判定即可。如:

if 0x81<=ch1<=0xfe and (0x40<=ch2<=0x7e or 0x7e<=ch2<=0xfe):  #is gb char

這裡ch1和ch2分別是乙個字元的高位元組和低位元組。

如何定位(為什麼要定位我們在後面講)?首先介紹一下碼表。碼表是所有編碼放在一起形成的,你可以將其放在檔案中(這裡講述的是將編碼放在檔案中)。我們在存放編碼時是將有實際意義的編碼放在了一起(因為有一些組合是不存在的),而且是按位元組大小的順序放的。根據gbk的編碼範圍,我們可以設想乙個二維座標,縱座標是高位元組,橫座標是低位元組,每乙個交叉點上是乙個漢字,佔兩個位元組。這樣一行上的漢字個數應該為0xfe-0x40+1-1=190(加1是因為要把0x40也算進去。減1是因為要把7f去掉)。定位時,我們先用高位元組減去0x81,得到縱座標偏移量。用低位元組減去0x40得到橫座標偏移量。用縱座標偏移量乘以每個漢字個數,加上橫座標偏移量就得到漢字的偏移量。再乘以2得到位元組的偏移量。那麼定位演算法為:

index=((ch1-0x81)*190+(ch2-0x40)-(ch2/128))*2

上面的演算法中有-(ch2/128)。這是因為gbk中沒有7f碼,因此當ch2小於7f時,ch2/128=0,則表示7f沒有計算在內。而當ch2大於7f時,ch2/128=1,則表示多算了7f一值,因此要去掉。由於乙個漢字有兩個位元組,故要乘以2。這樣我們就得到乙個gbk漢字在碼表中的位元組位置了。

big5是香港和台灣地區使用的編碼集。它的範圍為:高位元組從0xa0到0xfe,低位元組從0x40到0x7e,和0xa1到0xfe兩部分。判斷乙個漢字是否是big5編碼,可以如上對字元的編碼範圍判斷即可。如何定位呢?那麼也想象所有編碼排列為乙個二維座標,縱座標是高位元組,橫座標是低位元組。這樣一行上的漢字個數:(0x7e-0x40+1)+(0xfe-0xa1+1)=157。那麼定位演算法分兩塊,為:

if 0x40<=ch2<=0x7e:  #is big5 char

index=((ch1-0xa1)*157+(ch2-0x40))*2

elif 0xa1<=ch2<=0xfe:  #is big5 char

index=((ch1-0xa1)*157+(ch2-0xa1+63))*2

對於第二塊,計算偏移量時因為有兩塊數值,所以在計算後面一段值時,不要忘了前面還有一段值。0x7e-0x40+1=63。

乙個用於編碼轉換的python模組的使用介紹

程式檔名為pygb2big.py。命令列:

python pygb2big.py [-u] [-b|-g] inputfile outputfile。

它主要的命令列引數為:-b,表示將gbk轉化為big5;-g,表示將big5轉成gbk;-u,顯示程式的用法。inputfile為輸入的待處理的檔案;而ouputfile為結果檔案。它帶有三個轉換碼表檔案,其中gbk2big.txt為gbk轉big5對照表;big2gbk.txt為big轉gbkcf對照表。另乙個為big2gbk-f.txt,只是提供但並未使用,它是將big5轉換為繁體gbk碼。

用PHP實現將GB編碼轉換為UTF8

gb2utf8.php 檔案如下 複製 如下 class gb2utf8 function set gb2312.txt this g程式設計客棧t codetable array while list key,value each tmp function convert str this gb ...

用python實現SYN Flooding攻擊

作業裡的 直接這裡copy在這裡記錄一下。在tcp ip協議中,當客戶端試著與伺服器間建立tcp連線時,正常情況下客戶端與伺服器端進行tcp三次握手 1.客戶端通過傳送syn同步 synchronize 資訊到伺服器要求建立連線。2.伺服器通過響應客戶端syn ack以抄收 acknowledge ...

用python實現氣泡排序與選擇排序

python氣泡排序 以公升序為例 s 0.1,3,9,5,2,6 for i in range 0,len s 1 for j in range i 1,len s if s i s j t s i s i s j s j t print s python選擇排序 以公升序為例 s 0.1,3,9...