亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

寬字符和窄字符的一個坑

2019-11-10 17:14:08
字體:
來源:轉載
供稿:網友

學習Windows編程的時候,遇到字符串處理會讓人非常抓狂,當然問題的根本還是自己學藝不精,不過還是得吐槽一下,造成這一局面的原因是規則變化多端而又有點不可捉摸,這不,最近就掉到坑里面去了。

先看看下面的這段代碼:

int main(int argn,char* argv[]){    char strA[]="ABC 簡體中文";    wchar_t strW[]=L"ABC 簡體中文";    PRintf("%s/n",strA);    wprintf(L"%s/n",strW);    return 0;}

猜猜看,輸出是什么?在我的電腦上(程序使用VS2010編譯通過,Windows 7操作系統,簡體中文版)運行的結果是這樣的:

image

第一個還好好地,怎么第二個會出現三個問號?

調試一下試試看,在return 0前面下斷點,然后查看內存:

image

image

這個是strA在內存中的值:41 42 43 20 bc f2 cc e5 d6 d0 ce c4 00

而strW則是:41 00 42 00 43 00 20 00 80 7b 53 4f 2d 4e 87 65 00 00

首先,我們知道char類型占一個字節,而wchar_t則是占兩個字節,前面的41,42,43,20就是分別’A’,’B’,’C’和’ ‘(空格),這里表明,寬字符采用的是Little-Endian方式存放兩個字節的,接下來我們把重點都放在漢字上面。

在strA中,表示漢字“簡體中文”數據為bc f2 cc e5 d6 d0 ce c4,而在strW則是80 7b 53 4f 2d 4e 87 65,差別很大,為什么是這樣呢?

這其中涉及到了編碼的問題。char類型中出現的漢字,采用的是GB2312的編碼規則,查詢該編碼表,可以發現,“簡”字的編碼為BCF2,“體”為CCE5,“中”為D6D0,而“文”則為CEC4,這就是strA中中文的表示方式,但是在寬字符strW中,采用的編碼則是Unicode編碼,在Windows平臺下Unicode編碼值就是UTF-16編碼值。查詢“簡體中文”四個漢字的編碼,可以發現是7B80 4F53 4E2D 6587,由于計算機的架構為Little-Endian,需要把高低位字節互換,這也就是寬字符的表示形式。

根據網頁上的說明(參考這里)C/C++標準只是聲明wchar_t是一個可以表示字符集中的任意一個字符的足夠寬的變量類型。wchar_t可以用任何encoding編碼方式來存儲這個字符,如ANSI、UCS-2或者UCS-4, 甚至是SCU-128,只不過我們通常是用unicode編碼方式。wchar_t是與實現相關的。所以為了可移植性,我們不能假定wchar_t的編碼方式,然后根據編碼方式做一些相關性操作,我們只能理解它為一個足夠寬的字符類型。

最后,我們還能順便發現,wprintf函數在處理文本輸出的時候,并不處理編碼問題,而是直接按多字節字符順序輸出。

好,現在問題的原因找到了,那么該如何解決問題呢?

Windows當然不會沒有想到這個問題,在Windows中,提供了如下兩個函數:WideCharToMultiByte和MultiByteToWideChar,他們都位于頭文件winnls.h中,分別是將寬字符轉化為多字節和將多字節轉化為寬字符。下面的例子直接給出了轉化的代碼,函數的具體使用方法可以翻閱MSDN。

int main(int argn,char* argv[]){    wchar_t strW[]=L"ABC 簡體中文";    char* pW2A;    int t=0;    //第一次,確定需要的字節數    t=WideCharToMultiByte(CP_ACP,0,strW,-1,NULL,0,NULL,FALSE);    if(t!=0)    {        pW2A=(char*)malloc(t);//分配內存,然后運行第二次,注意參數區別        WideCharToMultiByte(CP_ACP,0,strW,-1,pW2A,t,NULL,FALSE);        printf("%s/n",pW2A);        free(pW2A);    }    return 0;}
這回顯示就沒有什么問題了,長舒一口氣,暫時從坑里面爬出來了。
上一篇:樹的重心

下一篇:IO流的【字符流】

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品丝袜久久久久久不卡| 日韩**中文字幕毛片| 欧美亚洲第一区| 欧美激情一区二区三区成人| 亚洲风情亚aⅴ在线发布| 亚洲国产精品电影| 日韩在线视频网站| 国产色视频一区| 国产精品欧美在线| 国产精品福利久久久| 亚洲最大的免费| 国产日韩在线一区| 亚洲激情小视频| 国产精品91在线| 日韩av综合网| 97国产精品免费视频| 欧美富婆性猛交| 国产一区二区黑人欧美xxxx| 亚洲国产精品va在看黑人| 亚洲欧美日韩中文在线| 亚洲在线视频观看| 国产精品日韩av| 91精品国产成人| 在线播放国产一区中文字幕剧情欧美| 亚洲欧美日韩国产中文| 亚洲国产精品99久久| 亚洲成人激情在线观看| 91日韩在线播放| 欧美精品成人在线| 亚洲激情视频在线观看| 中文字幕在线日韩| 激情久久av一区av二区av三区| 亚洲精品videossex少妇| 在线观看中文字幕亚洲| 国产成人精品一区二区| 国产一区二区三区三区在线观看| 欧美又大粗又爽又黄大片视频| 日韩精品一区二区三区第95| 国产精品自拍视频| 精品国产一区二区三区四区在线观看| 亚洲精品一区二区三区婷婷月| 欧美视频免费在线观看| 久久久久久国产精品久久| 欧美视频一区二区三区…| 4k岛国日韩精品**专区| 欧美极品美女视频网站在线观看免费| 伊人伊人伊人久久| 全球成人中文在线| 欧美另类高清videos| 日韩中文字幕在线精品| 韩国19禁主播vip福利视频| 国产精品久久久久77777| 亚洲国产精品女人久久久| 久久久久久网址| 国产精品露脸自拍| 国产69精品99久久久久久宅男| 秋霞av国产精品一区| 国产一区二区三区在线视频| 夜夜嗨av色综合久久久综合网| 久久久伊人欧美| 亚洲精品ady| 亚洲国产精品yw在线观看| 亚洲一级免费视频| 亚洲黄在线观看| 久久久久久国产| 韩国视频理论视频久久| 亚洲qvod图片区电影| 久久久噜噜噜久噜久久| 久久久久久亚洲精品| 国产精品99久久久久久www| 欧美人与物videos| 久久久人成影片一区二区三区| 九九九热精品免费视频观看网站| 欧美性猛交丰臀xxxxx网站| 国产精品永久免费视频| 欧美巨乳在线观看| 最好看的2019年中文视频| 中文国产亚洲喷潮| 欧洲中文字幕国产精品| 韩国欧美亚洲国产| 国产一区玩具在线观看| 色婷婷综合成人av| 91av视频在线| 国产精品美女免费| 欧美日韩综合视频网址| 国产在线视频2019最新视频| 成人黄色av网站| 一区二区福利视频| 九九热精品视频在线播放| 欧美午夜片在线免费观看| 亚洲毛片一区二区| 日韩精品在线观看网站| 日韩欧美在线看| 成人精品视频久久久久| 日韩美女在线播放| 欧美日韩国产限制| 隔壁老王国产在线精品| 国产成人91久久精品| 中文字幕亚洲专区| 韩曰欧美视频免费观看| 国产香蕉97碰碰久久人人| 亚洲欧美色婷婷| 亚洲精品一区二区在线| 亚洲女人被黑人巨大进入| 久久久免费观看| 美女撒尿一区二区三区| 成人欧美一区二区三区黑人| 69国产精品成人在线播放| 欧美日韩国产综合新一区| 亚洲男人第一av网站| 国内精品久久久| 97超级碰碰碰| 国产成人一区二区三区小说| 国内精品久久久久久中文字幕| 国产香蕉一区二区三区在线视频| 国产一区二区丝袜高跟鞋图片| 亚洲国产一区自拍| 欧美有码在线观看视频| 伦伦影院午夜日韩欧美限制| 伊人久久五月天| 久久久久久久999精品视频| 亚洲成人黄色在线| 日韩欧美国产骚| 亚洲第一男人av| 国产大片精品免费永久看nba| 精品成人乱色一区二区| 久久亚洲精品毛片| 伊人久久久久久久久久久| 亚洲va男人天堂| 国产丝袜一区二区三区| 精品国产乱码久久久久久虫虫漫画| 国产精品视频永久免费播放| 91精品国产综合久久男男| 欧美激情一区二区三区久久久| 国产一区二区激情| 久久精品在线视频| 日韩精品视频观看| 欧美黑人巨大精品一区二区| 亚洲第一二三四五区| 国产又爽又黄的激情精品视频| 在线视频免费一区二区| 国内精品久久久久久| 一区二区三区无码高清视频| 国产男女猛烈无遮挡91| 国产日韩欧美视频在线| 成人www视频在线观看| 久久精品成人动漫| 久久免费视频网| 亚洲精品91美女久久久久久久| 国产精品网站大全| 九九久久精品一区| 91丨九色丨国产在线| 亚洲18私人小影院| 亚洲精品美女网站| 国产精品自在线| 亚洲国产精品va在线| 国产69精品久久久| 亚洲国产精品99| 亚洲一区第一页| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲欧美日本另类| 亚洲免费av网址| 在线精品高清中文字幕| 亚洲欧美国产精品久久久久久久|