常用字符集編碼的概要特性(二)

2021-08-29 09:16:48 字數 4117 閱讀 1303

big5

big5是雙位元組編碼,高位元組編碼範圍是0x81-0xfe,低位元組編碼範圍是0x40-0x7e和0xa1-0xfe。和gbk相比,少了低位元組是0x80-0xa0的組合。0x8140-0xa0fe是保留區域,用於使用者造字區。

big5收錄的漢字只包括繁體漢字,不包括簡體漢字,一些生僻的漢字也沒有收錄。gbk收錄的日文假名字元、俄文本元big5也沒有收錄。因為big5當中收錄的字元有限,因此有很多在big5基礎上擴充套件的編碼,如倚天中文系統。windows系統上使用的**頁cp950也可以理解為是對big5的擴充套件,在big5的基礎上增加了7個漢字和一些符號。big5編碼對應的字符集是gbk字符集的子集,也就是說big5收錄的字元是gbk收錄字元的一部分,但相同字元的編碼不同。

因為big5也占用了ascii的編碼空間(低位元組所使用的0x40-0x7e),所以big5編碼在一些環境下存在和gbk編碼相同的問題,即低位元組範圍為0x40-0x7e的字元有可能會被誤處理,尤其是低位元組是0x5c("/")和0x7c("|")的字元。可以參考gbk一節相應說明。

儘管有些區別,大多數情況下可以把cp950當作big5的別名。

iso-8859-1

iso-8859-1編碼是單位元組編碼,向下相容ascii,其編碼範圍是0x00-0xff,0x00-0x7f之間完全和ascii一致,0x80-0x9f之間是控制字元,0xa0-0xff之間是文字元號。

iso-8859-1收錄的字元除ascii收錄的字元外,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字元號。歐元符號出現的比較晚,沒有被收錄在iso-8859-1當中。

因為iso-8859-1編碼範圍使用了單位元組內的所有空間,在支援iso-8859-1的系統中傳輸和儲存其他任何編碼的位元組流都不會被拋棄。換言之,把其他任何編碼的位元組流當作iso-8859-1編碼看待都沒有問題。這是個很重要的特性,mysql資料庫預設編碼是latin1就是利用了這個特性。ascii編碼是乙個7位的容器,iso-8859-1編碼是乙個8位的容器。

latin1是iso-8859-1的別名,有些環境下寫作latin-1。

ucs-2和utf-16

unicode組織和iso組織都試圖定義乙個超大字符集,目的是要涵蓋所有語言使用的字元以及其他學科使用的一些特殊符號,這個字符集就是通用字符集(ucs,universal character set)。這兩個組織經過協調,雖然在各自發展,但定義的字元位置是完全一致的。iso相應的標準是iso 10646。unicode和iso 10646都在不斷的發展過程中,所以會有不同的版本號來標明不同的發展階段,每個unicode版本號都能找到相對應的iso 10646版本號。

iso 10646標準定義了乙個31位的字符集。前兩個位元組的位置(0x0000-0xfffd)被稱為基本多語言面(basic multilingual plane, bmp) ,超出兩個位元組的範圍稱作輔助語言面。bmp基本包括了所有語言中絕大多數字元,所以只要支援bmp就可以支援絕大多數場合下的應用。unicode 3.0對應的字符集在bmp範圍內。

ucs字符集為每個字元分配了乙個位置,通常用「u」再加上某個字元在ucs中位置的16進製制數作為這個字元的ucs表示,例如「u+0041」表示字元「a」。ucs字元u+0000到u+00ff與iso-8859-1完全一致。

ucs-2、utf-16是ucs字符集(或者說是unicode字符集)實際應用中的具體編碼方式。ucs-2是兩個位元組的等寬編碼,因為只是使用了兩個位元組的編碼空間,所以只能對bmp中的字元做編碼。utf-16是變長編碼,用兩個位元組對bmp內的字元編碼,用4個位元組對超出bmp範圍的輔助平面內的字元作編碼。

ucs-2不同於gbk和big5,它是真正的等寬編碼,每個字元都使用兩個位元組,這個特性在字串截斷和字元數計算時非常方便。

utf-16是ucs-2的超集,utf-16編碼的兩位元組編碼方式完全和ucs-2相同,也就是說在bmp的框架內ucs-2完全等同與utf-16。實際情況當中常常把ucs-16當作ucs-2的別名。

ucs-2和utf-16在儲存和傳輸時會使用兩種不同的位元組序,分別是big endian和little endian(大尾和小尾)。例如「啊」(u+554a)用big endian表示就是0x554a,用little endian表示就是0x4a55。ucs-2和utf-16預設的位元組序是big endian方式。在傳輸過程中為了說明位元組序需要在位元組流前加上bom(byte order mark),0xfeff表示是big endian,0xfffe表示是little endian。ucs-2be、ucs-2le是實際應用中使用的編碼名稱,對應著big endian和little endian,utf-16be、utf-16le也是如此。因為預設是be位元組序,所以可以把ucs-2當做是ucs-2be的別名。

在ucs編碼中有乙個叫做「zero width no-break space」的字元,它的編碼是u+feff,是個沒有實際意義的字元。ucs規範建議我們在傳輸位元組流前,先傳輸字元「zero width no-break space」,如果傳輸的zero width no-break space是0xfeff就說明是big endian,反之就是little endian。

ucs-2和utf-16也可以理解為和ascii以及iso-8859-1相容,在ascii編碼或者iso-8859-1編碼的每個位元組前加上0x00,就得到相應字元的ucs-2編碼。

ucs-2和utf-16中會使用0x00作為某個字元編碼的一部分,某些系統會把0x00當作字串結束的標誌,在處理ucs-2或utf-16編碼時會出現問題。

utf-8

utf-8是ucs字符集的另一種編碼方式,utf-16的每個單元是兩個位元組(16位),而utf-8的每個單元是乙個位元組(8位)。utf-16中用乙個或兩個雙位元組表示乙個字元,utf-8中用乙個或幾個單位元組表示乙個字元。

可以認為utf-8編碼是根據一定規律從ucs-2轉換得到的,從ucs-2到utf-8之間有以下轉換關係:

ucs-2

utf-8

u+0000 - u+007f

0******x

u+0080 - u+07ff

110***xx 10******

u+0800 - u+ffff

1110***x 10****** 10******

例如「啊」字的ucs-2編碼是0x554a,對應的二進位制是0101 0101 0100 1010,轉成utf-8編碼之後的二進位制是111001011001010110001010,對應的十六進製制是0xe5958a。

ucs-4也是一種ucs字符集的編碼方式,是使用4個位元組的等寬編碼,可以用ucs-4來表示bmp之外的輔助面字元。ucs-2中每兩個位元組前再加上0x0000就得到了bmp字元的ucs-4編碼。從ucs-4到utf-8也存在轉換關係,根據這種轉換關係,utf-8最多可以使用六個位元組來編碼ucs-4。

根據utf-8的生成規律和ucs字符集的特性,可以看到utf-8具有的特性:

utf-8完全和ascii相容,也就是說ascii對應的字元在utf-8中和ascii編碼完全一致。範圍在0x00-0x7f之內的字元一定是ascii字元,不可能是其他字元的一部分。gbk和big5都存在的缺陷在utf-8中是不存在的。

大於u+007f的ucs字元,在utf-8編碼中至少是兩個位元組。

utf-8中的每個字元編碼的首位元組總在0x00-0xfd之間(不考慮ucs-4支援的情況,首位元組在0x00-0xef之間)。根據首位元組就可以判斷之後連續幾個位元組。

非首位元組的其他位元組都在0x80-0xbf之間;0xfe和0xff在utf-8中沒有被用到。

gbk編碼中的漢字字元都在ucs-2中的範圍都在u+0800 - u+ffff之間,所以每個gbk編碼中的漢字字元的utf-8編碼都是3個位元組。但gbk中包含的其他字元的utf-8編碼就不一定是3個位元組了,如gbk中的俄文本元。

在utf-8的編碼的傳輸過程中即使丟掉乙個位元組,根據編碼規律也很容易定位丟掉的位置,不會影響到其他字元。在其他雙位元組編碼中,一旦損失乙個位元組,就會影響到此位元組之後的所有字元。從這點可以看出utf-8編碼非常適合作為傳輸編碼。

ke 2007-09-13 15:01

常用字符集編碼格式詳解

ascii ascii碼是7位編碼,編碼範圍是0x00 0x7f。ascii字符集包括英文本母 阿拉伯數字和標點符號等字元。其中0x00 0x20和0x7f共33個控制字元。只支援ascii碼的系統會忽略每個位元組的最高位,只認為低7位是有效位。hz字元編碼就是早期為了在只支援7位ascii系統中傳...

常用字符集的總結

ascii編碼 主要包括26字母,數字符號,和一些常用符號,用乙個位元組足夠 1個位元組可以表示2 8 256種字元 實際上,這些字元只使用了1個位元組的7位。其中0 127最高位是0,另外128個擴充套件的ascii碼,最高位都是1。它是最通用的單位元組編碼系統。iso8859 1 通常叫做lat...

正則常用字符集簡寫

由於有些字符集很常用,所以正規表示式本身就提供了對這類字符集的簡寫 如上圖所示,s s d d w w這六個字符集在平時是很常用的,左邊兩邊的正則,一般情況下,表示的含義是一樣的,也就是等價的。也許你已經發現了,s和 s只是字母大小寫的區別,代表的字符集就變成相反的了。s和 s是沒有交集的,但它們是...