各編碼格式略談

2021-08-06 02:50:43 字數 2612 閱讀 5765

1、ascii

計算機和網路這東西嘛,大家都知道,發源於美國,而美國呢是用英語的,而英語呢——嗯,算著大小寫,字母總共就52個,再加上些別的符號,也不會很多,當通訊在美國萌芽的時候,需要表示的符號並沒有多少,用8位也就足夠了,標準ascii碼在這時應運而生了。每個字元它只用乙個位元組(即8位)來表示,說得更詳細些,其實只用了最低的7位,最高位是用來做校驗的。此後,這個ascii碼表示規範成為了國際標準

舉例,小寫字母a,它的ascii碼用二進位制來表示是 0110  0001,用十進位制表示也就是97,最高位(最左一位)為0。

2、擴充套件ascii碼

好了,ascii碼已經可以表示英語裡所有字元和很多其他字元了,夠美國人用了,可後來呢——計算機這玩意兒越來越普及了,其他歐美國家也可以發展了,他們發現自己國家的文字在ascii碼裡根本就沒有,畢竟ascii碼就那麼128個。好了,再擴充套件一下吧-----把最高位也利用起來,不用它來做奇偶校驗了。於是ibm又把ascii碼一下又擴充套件出了128個,總共可以表示256個字元了。它把值為128-255之間的字元用於畫圖和畫線,以及一些特殊的歐洲字元。同時,還有另一部分人,把128--255之間當做了別的用途,比如

用於拉丁字母表中特殊語言字元的編碼(

isolatin-1標準

)。所以,擴充套件出的這128個碼具體表示哪個字元有多個標準,因此

擴充套件ascii碼就不是國際標準了,沒有乙個統一的標準。

3、gbk

當計算機來到中國的時候,龐大的漢字數量需要一套全新的支援漢字的編碼規範。

gb2312:與ascii碼相容,也就是當表示英文本元這種ascii碼中存在的字元時,仍採用乙個位元組表示;當表達漢字時,採用兩個位元組表示,高位元組叫「區」,低位元組叫「位」,且區和位的首位都是1,如 10100010,11000110,這樣當解析字元時一旦讀到乙個位元組的最高位是1就知道了----後面的那個位元組跟它是配對的,它倆組成乙個字元-----因為當最高位是0時,肯定是原ascii碼字元。

gbk:gb2313之後發現這樣編碼還是不夠用,那就乾脆規定,「區」的最高位仍是1,「位」的最高位不限制了,因為這樣也並不影響解讀。於是在gb2312的基礎上又擴充套件出了gbk規範。

gbk18030:gbk之後還是不夠用,再擴充套件,又出了gbk18030。

4、unicode

再後來,越來越多國家的文字需要支援,而且各個國家自己定義的規範與別國的都是不相容的,這時unicode出現了,它不考慮其他國家已自定義的各種規範----它要為全球定義乙個通用的規範,

」universal multiple-octet coded character set」,簡稱 ucs, 俗稱 「

unicode

」。並且這個標準是相容iso latin-1的,當然,也是相容ascii規範的。還以小寫的a舉例,在ascii碼中a的數字值是97,那麼在unicode中仍規定a對應的數字是97。

unicode 編碼包含了不同寫法的字,如「ɑ/a」、「戶/戶/戸」

,又說----

在文書處理方面,統一碼為每乙個字元而非字形定義唯一的**(即乙個整數)。換句話說,統一碼以一種抽象的方式(即數字)來處理字元,並將視覺上的演繹工作(例如字型大小、外觀形狀、字型形態、文體等)留給其他軟體來處理,例如網頁瀏覽器或是文字處理器。

讀來讀去,總覺這段話自相矛盾,既然包含了不同寫法的字,那就應該是為這些不同寫法的字每個都配了相應的**吧?那後面又怎麼說「

為每乙個字元而非字形定義唯一的**」?它的意思大概是----

大家記不記得有些特別另類的漢字,當做同乙個字來用但是寫起來差別特別大,這種現象好像叫「變體」。我舉不出例子,但是咱就來個假設吧,例如,假設「品」字就是「碼」字的變體,寫「編碼」正確,寫「編品」也同樣正確,此時「碼」和「品」除了寫法不一樣,其他,包括字義、用法、讀音全部一樣。實際在unicode中就是看做是兩個字了,它們有各自對應著的數字。

值得注意的一點是,

unicode裡的字元並不一定占用兩個位元組實際上,unicode只是乙個規定,它規定乙個符號跟哪乙個數字對應,簡而言之,它用乙個數字對映乙個字元,但是沒有規定在計算機裡你怎樣去儲存這個數字。unicode跟位元組是沒有必然聯絡的,只是這個規範是跑在計算機上的,當這個規範實現的時候也就和位元組發生了聯絡,因為資料在計算機裡就是用位元組儲存的。舉個例子,假設unicode規定「京」這個字對應著數字325,unicode實現規範a可能這樣在計算機裡實現:用三個位元組,三個位元組分別表示百、十、個位,即00000011,00000010,00001010,而b則這樣實現:我盡量用較少的空間表示,325超出了乙個位元組的表示範圍,但可以用兩個位元組表示,於是b這樣表示325----00000001,01000101,看!同樣表示325,不同的實現方式就會占用不同的位元組數。utf-8,utf-16就是unicode的不同實現,

打個比方,unicode是個介面,utf-8和utf-16就是它的實現類

常見編碼格式(中文編碼)

中文編碼主要有以下四種 gb2312簡體中文編碼,乙個漢字占用2個位元組,在大陸是主要的編碼方式。當文章 網頁中包含正體中文 日文 韓文等時,這些內容可能無法被正確編碼。big5正體中文編碼,主要在台灣地區使用。gbk支援簡體及正體中文,但對他國非拉丁字母語言還是有問題。utf 8 unicode編...

http chunked編碼格式

http的響應資料由下面2部分構成 響應頭 資料部分 資料部分的格式由響應頭說明 一般情況下,http的響應頭包含content length域來指明資料的長度,例如 通常使用chunked編碼進行傳輸的時候,會先將資料進行壓縮。http響應頭中的content encoding域指明了壓縮格式。當...

MySQL編碼格式

mysql在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的unicode。好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。當然,為了節省空間,一般情況下使用utf8也就夠了。二 內容描述 那上面說了既...