理清計算機漢字編碼問題(上)

2021-09-17 19:52:51 字數 3750 閱讀 7019

1.1 ascii

ascii(american standard code for information interchange:美國資訊交換標準**)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。它是現今最通用的資訊交換標準,並等同於國際標準iso/iec 646。

ascii碼表分為兩部分:控制字元和可顯示字元。這個不用多解釋,相信學過c語言或者計算機電子資訊相關專業的都涉及,更多請參考ascii碼對照表。

1.2 漢字機內碼

漢字機內碼,又稱「漢字ascii碼」,簡稱「內碼」,指計算機內部儲存,處理加工和傳輸漢字時所用的由0和1符號組成的**。輸入碼被接受後就由漢字作業系統的「輸入碼轉換模組」轉換為機內碼,與所採用的鍵盤輸入法無關。機內碼是漢字最基本的編碼,不管是什麼漢字系統和漢字輸入方法,輸入的漢字外碼到機器內部都要轉換成機內碼,才能被儲存和進行各種處理。

關於國標碼、區位碼和機內碼之間的換算,參考

csdn ~

~ c語言獲取漢字機內碼、區位碼、國際碼:

#include

void

main

(void

)

1.3 unicode

unicode(統一碼、萬國碼、單一碼)是電腦科學領域裡的一項業界標準,包括字符集、編碼方案等。unicode 是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一並且唯一的二進位制編碼,以滿足跨語言、跨平台進行文字轉換、處理的要求。2023年開始研發,2023年正式公布。

unicode只有乙個字符集,中、日、韓的三種文字占用了unicode中0x3000到0x9fff的部分 unicode目前普遍採用的是ucs-2,它用兩個位元組來編碼乙個字元, 比如漢字"經"的編碼是0x7ecf,注意字元碼一般用十六進製制來 表示,為了與十進位制區分,十六進製制以0x開頭,0x7ecf轉換成十進位制 就是32463,ucs-2用兩個位元組來編碼字元,兩個位元組就是16位二進位制, 2的16次方等於65536,所以ucs-2最多能編碼65536個字元。 編碼從0到127的字元與ascii編碼的字元一樣,比如字母"a"的unicode 編碼是0x0061,十進位制是97,而"a"的ascii編碼是0x61,十進位制也是97, 對於漢字的編碼,事實上unicode對漢字支援不怎麼好,這也是沒辦法的, 簡體和繁體總共有六七萬個漢字,而ucs-2最多能表示65536個,才六萬 多個,所以unicode只能排除一些幾乎不用的漢字,好在常用的簡體漢字 也不過七千多個,為了能表示所有漢字,unicode也有ucs-4規範,就是用 4個位元組來編碼字元。

更多請參考 ~ unicode字元表

1.4 utf-8

網際網路的普及,強烈要求出現一種統一的編碼方式。utf-8 就是在網際網路上使用最廣的一種 unicode 的實現方式。其他實現方式還包括 utf-16(字元用兩個位元組或四個位元組表示)和 utf-32(字元用四個位元組表示),不過在網際網路上基本不用。重複一遍,這裡的關係是,utf-8 是 unicode 的實現方式之一。

utf-8 最大的乙個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示乙個符號,根據不同的符號而變化位元組長度。

utf-8 的編碼規則很簡單,只有二條:

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

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

下表總結了編碼規則,字母x表示可用編碼的位。

unicode符號範圍(十六進製制)

utf-8編碼方式(二進位制)

0000 0000-0000 007f

0******x

0000 0080-0000 07ff

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

0000 0800-0000 ffff

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

0001 0000-0010 ffff

11110*** 10****** 10****** 10******

跟據上表,解讀 utf-8 編碼非常簡單。如果乙個位元組的第一位是0,則這個位元組單獨就是乙個字元;如果第一位是1,則連續有多少個1,就表示當前字元占用多少個位元組。

下面,還是以漢字嚴為例,演示如何實現 utf-8 編碼:

嚴的 unicode 是4e25(100111000100101),根據上表,可以發現4e25處在第三行的範圍內(0000 0800 - 0000 ffff),因此嚴的 utf-8 編碼需要三個位元組,即格式是1110***x 10****** 10******。然後,從嚴的最後乙個二進位制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,嚴的 utf-8 編碼是11100100 10111000 10100101,轉換成十六進製制就是e4b8a5。

1.5 gbk、gb2312

gbk漢字國標擴充套件碼,基本上採用了原來gb2312-80所有的漢字及碼位,並涵蓋了原unicode中所有的漢字20902。gbk編碼是中國大陸制訂的、等同於ucs的新的中文編碼擴充套件國家標準。

gb 2312或gb 2312-80是乙個簡體中文字符集的中國國家標準,gb 2312標準共收錄6763個漢字。

1.6 gbk/gb2312、utf-8、unicode區別和聯絡

字元編碼筆記:ascii,unicode 和 utf-8

ascii,unicode和utf-8終於找到乙個能完全搞清楚的文章了

utf-8 gbk utf8 gb2312之間的區別和關係

編碼之------unicode到底是什麼?神馬utf-8和gbk到底是什麼?utf-8和unicode關係?

字元編碼gb2312、gbk、utf-8的區別

區分: 編碼方式 字符集 unicode utf-8

在計算機記憶體中,統一使用unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為utf-8編碼;

用記事本編輯的時候,從檔案讀取的utf-8字元被轉換為unicode字元到記憶體裡,編輯完成後,儲存的時候再把unicode轉換為utf-8儲存到檔案;

瀏覽網頁的時候,伺服器會把動態生成的unicode內容轉換為utf-8再傳輸到瀏覽器。

在作業系統(windows、安卓)中,字元編碼工作方式參照上文【字元編碼工作方式】。但在mcu微機中,處理方式不一樣,在微機中由於資源有限,通常是通過漢字機內碼計算漢字字元對應的位址,然後查詢字型檔ic(帶rom或者flash)顯示。上圖中,漢字在計算機內儲存、處理/傳輸都是機內碼,但為了資訊交換於是便產生了國標(gbk/gb2312)即《資訊交換用漢字編碼字符集》,國標當然只適用於國內,於是國際上便產生了unicode萬國碼,它又僅僅定義了乙個字符集,utf-8則就是按照unicode字元實現的一種編碼。

剛開始就很想弄懂unicode、gbk/gb2312、utf-8和機內碼,徹底分清它們,但是查詢了之後很多概念容易一頭霧水。透過上圖,大家應該很容易,理清它們間的關係和區別,相信在開發中遇到漢字編碼都會迎刃而解,嘻嘻!

附:utf-8轉unicode ~

漢字字符集編碼查詢 ~

計算機漢字編碼系統

windows 頁 頁說明 別名歐美語言 1252 us ascii 20127 us ascii ascii iso 8859 1 1252 西歐字元 windows x ansi ibm437 437 oem 美國 簡體中文 936 gb2312 936 簡體中文 gb2312 gbk cn g...

漢字編碼問題

漢字編碼問題 由於常常要和漢字處理打交道,因此,我常常受到漢字編碼問題的困擾。在不斷的打擊與堅持中,也積累了一點漢字編碼方面的經驗,想和大家一起分享。一 漢字編碼的種類 漢字編碼中現在主要用到的有三類,包括gbk,gb2312和big5。1 gb2312又稱國標碼,由國家標準總局發布,1981年5月...

漢字編碼問題

漢字編碼問題 由於常常要和漢字處理打交道,因此,我常常受到漢字編碼問題的困擾。在不斷的打擊與堅持中,也積累了一點漢字編碼方面的經驗,想和大家一起分享。一 漢字編碼的種類 漢字編碼中現在主要用到的有三類,包括gbk,gb2312和big5。1 gb2312又稱國標碼,由國家標準總局發布,1981年5月...