撥開字元編碼的迷霧

2021-08-07 13:16:19 字數 2574 閱讀 3127

為什麼這樣的json會解析失敗?

為什麼介面上韓文顯示亂碼?

ascii和ansi有什麼區別?

相信不少人在字元編碼上面摔過跟頭,這篇文章針對開發中需要了解的字元編碼知識進行了簡要的講解,希望能夠對大家有所幫助。

字符集就是一系列用於顯示的字元的集合。ascii字符集由美國國家標準協會(american national standard institute)於2023年制定乙個字元對映集合。

ascii使用7位二進位制位來表示乙個字元,總共可以表示128個字元(即2^7,二進位制000 0000 ~ 111 1111十進位制0~127)。

ascii字符集中每個數字對應乙個唯一的字元,如下表:

因為其對應關係非常簡單,不需要特殊的編碼規則,所以嚴格來講ascii不能算字元編碼,因為它沒有規定編碼規則。我們只是習慣將ascii字符集稱之為ascii碼、ascii編碼。

ascii字符集是美國人發明的,這些字元完全是為其量身定製的。但隨著計算機技術的發展和普及,傳到了歐洲(如法國、德國)各國。由於歐洲很多國家中使用的字元除了ascii表中的128個字元之外,還有一些各國特有的字元,於是歐洲人民發現ascii字符集表達不了他們所要表達的東西呀。怎麼辦了?他們發現ascii只使用了乙個位元組(8位)之中的低7位,於是歐洲各國開始各顯神通,打起了那1個最高位(第0位)的主意,將最高位利用了起來,這樣又多了128個字元,從而滿足了歐洲人民的需要。

但因為每個國家的需求不一樣,各國都設計了不同的方案。為了結束這種混亂的局面,國際標準化組織(iso)及國際電工委員會(iec)聯合制定了一系列8位字符集的標準,統稱為iso 8859(全稱iso/iec 8859)。注意,這是一系列字符集的統稱。如iso/iec 8859-1(也就是常聽到的latin-1)支援西歐語言,iso/iec 8859-4(latin-4)支援北歐語言等。

我們在資料庫中常見到的latin-1、2、5、7其實就是上面提到的針對特定語言的ascii擴充套件字符集。

前面講到了,歐洲各國有效利用閒置的最高位,對ascii字符集進行了擴充套件。可是歐洲人民沒有想到的是(當然他們也不用想這麼多),在大洋彼岸有著乙個擁有五千年歷史的偉大民族,她擁有著成千上萬的漢字,1個位元組顯然不夠表達如此深厚的文化底蘊。

於是當計算機引入到中國之初,國家技術監督局就設計了gb系列編碼方案(gb=guo biao)。

gb編碼方案使用2個位元組來表達乙個漢字。同時為了相容ascii編碼,規定各個位元組的最高位(首位)必須為1,從而避免了和最高位為0的ascii字符集的衝突。

gb系列字符集經歷下面的幾個發展過程:

編碼名稱

發布時間

位元組數漢字範圍

gb2312

2023年

變位元組(ascii 1位元組,漢字2個位元組)

6763個漢字

gb13000

2023年第一版

變位元組(ascii 1位元組,漢字2個位元組)

20902個漢字

gbkwindows95中

2個位元組

21886個漢字和圖形符號(含gb2312,big5中所有字元)

gb18030

2023年第一版

變位元組(ascii 1位元組,漢字2個或4個位元組)

27484個漢字

每一次迭代,支援的字元數量都會增加,而且每一次迭代都會保留之前版本支援的編碼,所以做到了向上相容。

因為漢字在顯示器上的顯示寬度要比英文本元的寬度要寬一倍,在一起排版顯示時不太美觀。所以gb編碼不僅僅加入了漢字字元,而且包括了ascii字符集中本來就有的數字、標點符號、字母等字元。這些被編入gb編碼的數字、標點、字母在顯示器上的顯示寬度比ascii字符集中的寬度寬一倍,所以前者稱為全形字符,後者稱為半形字元。

前面說到了世界各國針對ascii的擴充套件方案(如歐洲的iso/iec 8859,中國的gb系列等),這些ascii擴充套件編碼方案的特點是:他們都相容ascii編碼,但他們彼此之間是不相容的。微軟將這些編碼方案統稱為ansi編碼。故ansi並不是特指某一種編碼方案,只有知道了在哪個國家,哪個語言環境下,它表示具體的編碼方案。

在windows作業系統上,預設使用ansi來儲存檔案。那麼作業系統是如何知道ansi到底應該表示哪種編碼了,是gbk,還是ascii,或者還是euc-kr了? windows通過乙個叫"code page"(翻譯為中文就叫**頁)的東西來判斷系統的預設編碼。

簡體中文作業系統預設的**頁是936,它表示ansi使用的是gbk編碼。

gb18030編碼對應的windows**頁為cp54936。

可以使用命令chcp來檢視系統預設的**頁:

漢字"

撥開字元編碼的迷霧 字元編碼轉換

撥開字元編碼的迷霧 字元編碼概述 撥開字元編碼的迷霧 編譯器如何處理檔案編碼 撥開字元編碼的迷霧 字元編碼轉換 本文介紹使用windows api進行字元編碼的轉換,涉及widechartomultibyte和multibytetowidechar2個api,api介面名中的multibyte對應著...

撥開字元編碼的迷霧 字元編碼轉換

撥開字元編碼的迷霧 字元編碼概述 撥開字元編碼的迷霧 編譯器如何處理檔案編碼 撥開字元編碼的迷霧 字元編碼轉換 撥開字元編碼的迷霧 mysql資料庫字元編碼 本文介紹使用windows api進行字元編碼的轉換,涉及widechartomultibyte和multibytetowidechar2個a...

撥開字元編碼的迷霧 編譯器如何處理檔案編碼

使用visual studio建立的c 工程可以在工程屬性配置屬性 常規中配置字符集 使用unicode字符集 預設 使用多位元組字符集。這個設定項不對字元編碼產生直接的影響 注意這裡的 直接 二字,第3節會說到 只會在工程屬性配置屬性 c c 預處理器加入相應的巨集 使用unicode字符集 un...