對字符集和字元編碼的解析

2021-10-04 12:48:03 字數 3036 閱讀 9019

3、ansi、utf-8、utf-16le、utf-16be區別

我記得有一次使用emwin的foncnv時,讀入pattern檔案,出現了好多字元無法識別,當時我就納悶了,我用的字型是是這種語言的編碼的,怎麼會無法識別,於是使用windows記事本開啟,檢查了下檔案屬性,發現該檔案是按照utf-8形式儲存的,心想怪不得。將檔案使用utf-16le儲存,解決了這個問題,我就很好奇這兩種有啥區別來著,今天查閱資料大致了解了下兩者的區別。

字符集是各種文字和符號的集合,常見字符集有ascii碼字符集,unicode字符集,gb2312字符集,字元編碼是將字符集中字元對映成某種形式,以便儲存在計算機裡。字符集可以認為是一張用數字代表文字或符號的表,字元編碼則是這些數字以什麼形式儲存在計算機儲存裝置中。

計算機最早是由歐美人發明的,普遍使用的是ascii字符集,該字符集以使用0-127(0x00-0x7f)表示歐美人常用的英文本元和符號,並且留了128個(0x80-0xff)的空白字元用來擴充套件其他的字元。

由於計算機走向了全世界,然而全世界國家那麼多,每個國家都有自己的文字和語言,128個擴張字符集是遠遠不夠,那麼每個國家都需要自己的字符集,假設你在a國編輯的檔案中"0x01"在該國表示的是一種意思,在b國"0x01"表示的又是另外一種意思,這樣該檔案內容在兩個國家就有不一樣的含義。那麼多個國家該如何協同工作呢?unicode字符集的出現解決了這個問題,unicode碼被稱為萬國碼,大部分國家的字元和符號都有被收納,到現在unicode碼還在不斷增加。

unicode是字符集也就是一張用數字代表文字或符號的表,utf-8、utf-16le、utf-16be是unicode字符集的字元編碼,決定了該檔案內容以什麼形式儲存在計算機中.

下圖是windows記事本儲存檔案時可以選擇的編碼方式。

對於乙個txt檔案中包含「adc」,讓我們看看以不同字元編碼方式儲存,使用16進製制編輯器開啟看看有什麼區別:

1、ansi的編碼方式和utf-8編碼方式的內容是一樣的。

ansinc

utf-8nc

『a』61

『a』61

『d』64

『d』64

『c』63

『c』63

2、utf-16le和utf-16be

le是小端儲存(低位元組在低位,高位元組在高位),be是大端儲存(高位元組在低位,低位元組在高位),可以看出以utf-16le編碼方式儲存的檔案由ff fe開頭,每個字元使用16bit來進行編碼儲存,utf-16be儲存在裝置中的形式是和utf-16le高低位相反的。

leff fe

befe ff

『a』61 00

『a』00 61

『d』64 00

『d』00 64

『c』63 00

『c』00 63

乙個txt檔案中包含字讓我們看看以不同字元編碼方式儲存,使用2進製開啟看看有什麼區別:

通過這個**,我們可以查出』中』字的字元編碼是

header 1

header 2

gb2312編碼

d6d0

gbk編碼

d6d0

unicode編碼

4e2d

首先看ansi編碼儲存的,咱們的windows使用ansi儲存預設使用的是gbk編碼。如下圖所示儲存內容為d6 d0和上表中的編碼一致,

如下圖utf-8是unicode字符集的一種編碼方式,照理來說應該也是4e 2d的,怎麼會是ad b8 e4呢?接下來分析一波:

如上圖所示,該圖是utf-8的編碼方式,"中"字的unicode編碼是4e 2d,在0x800-0x10000中,所以使用上圖中第三行的編碼公式。

十六進製制

二進位制e4

11100100‬

b8‭10111000‬

ad‭10101101‬

開啟windows上的計算器,我們來看看4e2d的二進位制形式為0100-111000-101101‬,根據上面的編碼方式,可以得到

((e4 & 0x0f)<<12 | ((b8 & 0x3f)<<6) | ((ad & 0x3f)<<0)

= 0100-111000-101101‬ = 4e2d

最後終於得到了4e2d,為什麼要兜這麼大的乙個圈子呢?因為對於英文來說, 符號和字元比較少,如果都使用utf16形式儲存,就會出現 00 xx 00 xx 00 xx的形式,這樣會儲存乙個字元就會就有乙個位元組被浪費,於是就有了utf-8這種編碼形式,。如果該字元小於等於0x7f的值就會使用像第乙個實驗一樣和ansi的在記憶體中的編碼方式是一樣的

參考資料:

[1]

[2] ‭

字符集和字符集編碼詳解

gb2312 gbk ascii asni unicode utf 8等等,這些字眼非常常見,同時帶來許多的問題。本文只是從理解的角度,說明以上內容的不同含義從而達到區分其用法的目的是夠了的。至於實現方式,可以查閱各自的詳細標準官方文件。先解釋乙個概念,什麼是字符集,嗯,不解釋了,我弄乙個吧 從今以...

字符集和字元編碼

字符集和字元編碼不錯的部落格 字符集 是乙個系統支援的所有抽象字元的集合。字元是各種文字和符號的總稱,包括各國家文字 標點符號 圖形符號 數字等。asicc,unicode,gbk,gb2312等 字元編碼 是一套法則,使用該法則能夠對自然語言的字元的乙個集合 如字母表或音節表 與其他東西的乙個集合...

字符集和字元編碼

字符集 建立文字檔案預設使用ansi,就是系統預設編碼方式,中文window系統預設使用gbk編碼方式 位元組 這是最基本的概念,位元組是計算儲存容量的一種計量單位,我們知道計算機只能識別1和0組成的二進位制位,乙個數就是1位 bit 為了方便計算,我們規定8位就是乙個位元組 字元 字元和位元組不太...