windows開發(fā)-utf-8和gbk互轉(zhuǎn)閑談

前言
在這里只是講述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的一個載體椰于。
Unicodeutf-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采坑這篇文章挂签。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疤祭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饵婆,更是在濱河造成了極大的恐慌勺馆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侨核,死亡現(xiàn)場離奇詭異草穆,居然都是意外死亡,警方通過查閱死者的電腦和手機搓译,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門悲柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人些己,你說我怎么就攤上這事豌鸡。” “怎么了段标?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵涯冠,是天一觀的道長。 經(jīng)常有香客問我逼庞,道長蛇更,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任赛糟,我火速辦了婚禮派任,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘璧南。我一直安慰自己吨瞎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布穆咐。 她就那樣靜靜地躺著颤诀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪对湃。 梳的紋絲不亂的頭發(fā)上崖叫,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音拍柒,去河邊找鬼心傀。 笑死,一個胖子當(dāng)著我的面吹牛拆讯,可吹牛的內(nèi)容都是我干的脂男。 我是一名探鬼主播养叛,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雅潭,長吁一口氣:“原來是場噩夢啊……” “哼疤估!你這毒婦竟也來了矮男?” 一聲冷哼從身側(cè)響起带污,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤提岔,失蹤者是張志新(化名)和其女友劉穎浓若,沒想到半個月后皇钞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體已日,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡嘿架,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年瓶珊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸彪。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡伞芹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝉娜,到底是詐尸還是另有隱情唱较,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布蜀肘,位于F島的核電站绊汹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扮宠。R本人自食惡果不足惜西乖,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坛增。 院中可真熱鬧获雕,春花似錦、人聲如沸收捣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罢艾。三九已至楣颠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咐蚯,已是汗流浹背童漩。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留春锋,地道東北人矫膨。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侧馅。 傳聞我的和親對象是個殘疾皇子危尿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容