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
b810111000
ad10101101
開啟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位就是乙個位元組 字元 字元和位元組不太...