前言
在這里只是講述utf-8是如何轉(zhuǎn)成gbk的大致原理奶段,不貼代碼黍檩。因為網(wǎng)上有大把的代碼實現(xiàn)utf-8與gbk的互轉(zhuǎn)饿凛。
在項目中處理字符編碼是一件非常痛苦的事情窟却。
測試人員:喂遇汞,你的程序有bug未妹。
我:什么bug?
測試人員:在我電腦上中文顯示亂碼空入。
我:不可能络它,我電腦上都沒問題,你的電腦是不是有毒歪赢。
玩笑開完酪耕,說正事。
首先要說明的是轨淌,這兩種編碼是不能直接互相轉(zhuǎn)換的迂烁。所以,只能借助第三者-UCS來實現(xiàn)递鹉。
UCS:Universal Character Set盟步,俗稱Unicode;是所有其他字符集標(biāo)準(zhǔn)的一個超集躏结。就問你們怕不怕却盘。
為什么說要借助Unicode來實現(xiàn),因為Unicode就是為了一統(tǒng)編碼天下來而誕生的媳拴。它使用兩個字節(jié)表示一個字符黄橘,即可以表示2^16個字符∏龋基本上可以囊括全世界的字符塞关。因此,世界各國的字符均可以在UCS中找到對應(yīng)的編碼子巾。
互轉(zhuǎn)方法
utf-8---Unicode---gbk
gbk---Unicode---utf-8
以“我是誰”為例
GBK: CED2 CAC7 CBAD
轉(zhuǎn)UNICODE后為: 6211 662F 8C01
再由UNICODE轉(zhuǎn)UTF-8: E68891 E698AF E8B081
知識普及:
utf-8編碼:utf英文全程UCS Transfer Format帆赢,utf-8表示每次傳輸8個比特小压。所以,可以將utf-8理解為Unicode的一個載體椰于。
Unicode與utf-8對應(yīng)關(guān)系
Unicode編碼 | utf-8編碼 |
---|---|
0000 0000-0000 007F | 0xxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
由上表可以看出怠益,utf-8為變長編碼。
gbk編碼為天朝獨有瘾婿,其又分為:gb2312,gbk標(biāo)準(zhǔn),gb18130蜻牢。
gb2312:又稱GB2312-1980。對ASCII的中文擴展偏陪;特點是兩個字節(jié)表示一個字符孩饼,且高低字節(jié)的前127號均預(yù)留給ASCII。共收錄漢字6763個竹挡。
gbk標(biāo)準(zhǔn):在GB2312的基礎(chǔ)上镀娶,去掉低字節(jié)中為ASCII預(yù)留的前127號。共收錄21886個漢字(包括繁體)和符號揪罕。
gb18130:采用utf-8類似的編碼方式梯码,是1/2/4字節(jié)變長編碼。兼容gb2312和gbk好啰。共收錄漢字70244個轩娶。
總結(jié)
正是由于每一種編碼都能映射到Unicode編碼;所以借助與Unicode框往,可以實現(xiàn)任意兩種編碼方式之間互相轉(zhuǎn)換鳄抒。
想要了解更多關(guān)于字符編碼歷史淵源,可以閱讀UNICODE,GBK,UTF-8區(qū)別這篇文章椰弊。里面對于各種編碼许溅,講的蠻詳細(xì),還有舉例秉版。
擴展
在C++中如何實現(xiàn)兩種編碼的互轉(zhuǎn)呢贤重?其實很簡單。
可以簡單粗暴的將Unicode編碼對應(yīng)到WideChar清焕,將其他編碼方式(gbk/utf-8等等)對應(yīng)到MultiChar并蝗。
而WideChar對應(yīng)的數(shù)據(jù)類型是wchar_t,MultiChar對應(yīng)的數(shù)據(jù)類型是char秸妥。
windows提供了兩個api實現(xiàn)char和whar_t之間的互轉(zhuǎn)滚停,如下:
-
MultiByteToWideChar
:字符串轉(zhuǎn)寬字符 -
WideCharToMultiByte
:寬字符轉(zhuǎn)字符串
gbk轉(zhuǎn)utf-8為例
- gbk轉(zhuǎn)Unicode:將gbk編碼的字符串通過
MultiByteToWideChar
接口轉(zhuǎn)換成Unicode編碼的數(shù)據(jù)。- Unicode轉(zhuǎn)utf-8:將Unicode編碼的數(shù)據(jù)通過
WideCharToMultiByte
接口轉(zhuǎn)換成utf-8編碼的字符串粥惧。
看键畴,是不是很簡單。
注意
在調(diào)用上述兩個接口時影晓,代碼頁(CodePage)參數(shù)要慎用CP_ACP
镰吵。想了解更多檩禾,請瀏覽windows開發(fā)-CP_ACP采坑這篇文章挂签。