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

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

寬字符和窄字符的一個坑

2019-11-10 19:24:32
字體:
來源:轉載
供稿:網友

學習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;}
這回顯示就沒有什么問題了,長舒一口氣,暫時從坑里面爬出來了。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www.欧美视频| 最好看的2019的中文字幕视频| 久久综合免费视频| 日韩黄色高清视频| 国产欧美一区二区三区视频| 欧美日韩国产中文精品字幕自在自线| 中文字幕一精品亚洲无线一区| 欧美日韩国产91| 亚洲精品www久久久| 国产高清在线不卡| 91久久久在线| 91福利视频网| 国产精品入口日韩视频大尺度| 国产精品久久久久免费a∨| 欧美日韩xxxxx| 欧美人与性动交a欧美精品| 日韩欧美在线视频观看| 欧美精品少妇videofree| 欧美日韩国产第一页| 国产一区二区在线免费| 国产精品第二页| 亚洲人成网站在线播| 国产免费一区二区三区香蕉精| 亚洲国产成人精品女人久久久| 国产精品视频大全| 成人免费自拍视频| 久久久噜噜噜久久中文字免| 午夜精品久久久久久久久久久久久| 国产一区二区在线免费视频| 有码中文亚洲精品| 久久精品视频免费播放| 97久久久久久| 日韩av网址在线| 欧美综合国产精品久久丁香| 精品国产一区av| 久久这里有精品视频| 精品国产精品自拍| 精品中文字幕在线2019| 欧美极品少妇与黑人| 国产欧美一区二区三区久久人妖| 中文国产亚洲喷潮| 国产精品入口夜色视频大尺度| 91伊人影院在线播放| 91九色国产视频| 国产有码在线一区二区视频| 最新国产精品亚洲| 国产在线观看精品一区二区三区| 久久久国产在线视频| 麻豆乱码国产一区二区三区| 91成人在线播放| 色偷偷噜噜噜亚洲男人| 91精品久久久久久久久不口人| 国产成人精品网站| 亚洲精品自产拍| 成人激情综合网| 亚洲精品成a人在线观看| 欧美精品免费在线| 美女啪啪无遮挡免费久久网站| 久久综合亚洲社区| 另类少妇人与禽zozz0性伦| 91久久久精品| 日韩一区二区欧美| 精品国产一区二区在线| 国产在线观看精品一区二区三区| 久久中国妇女中文字幕| 亚洲区一区二区| 久久久久久亚洲精品中文字幕| 欧美尺度大的性做爰视频| 欧美制服第一页| 精品国偷自产在线视频99| 欧美成人激情视频| 欧美激情视频一区二区三区不卡| 一区二区中文字幕| 91久久久国产精品| 亚洲图片制服诱惑| 国产精品视频一区国模私拍| 色噜噜国产精品视频一区二区| www.亚洲天堂| 欧美黄色片在线观看| 久久久久国色av免费观看性色| 国产一区二区三区在线| 97精品伊人久久久大香线蕉| 亚洲欧洲偷拍精品| 日本a级片电影一区二区| 国产一区视频在线| 一本色道久久综合狠狠躁篇的优点| 久久露脸国产精品| 97视频免费在线观看| 欧美高清视频在线| 美日韩精品视频免费看| 精品国产成人在线| 久久这里只有精品视频首页| 国产精品稀缺呦系列在线| 成人免费淫片aa视频免费| 欧美性生活大片免费观看网址| 国产男人精品视频| 韩剧1988免费观看全集| 国产精品久久91| 91精品中国老女人| 欧美日韩中文字幕在线| 久久精品国亚洲| 日韩精品视频免费专区在线播放| 视频在线一区二区| 美女啪啪无遮挡免费久久网站| 国产性色av一区二区| 在线观看日韩av| 亚洲最新中文字幕| 欧美成人一区在线| 亚洲风情亚aⅴ在线发布| 欧美小视频在线观看| 欧美高清视频一区二区| 91在线视频免费| 日韩在线视频中文字幕| 国产成人精品免费久久久久| 久久网福利资源网站| 红桃av永久久久| 亚洲精品白浆高清久久久久久| 国产日韩一区在线| 亚洲在线视频福利| 欧美日韩性视频在线| 精品一区电影国产| 亚洲自拍偷拍视频| 亚洲夜晚福利在线观看| 日韩免费在线视频| 亚洲激情视频在线| 成人精品在线视频| 国产精品2018| 日韩乱码在线视频| 亚洲欧美综合v| 亚洲欧洲一区二区三区久久| 一道本无吗dⅴd在线播放一区| 日本三级韩国三级久久| 午夜剧场成人观在线视频免费观看| 欧美视频在线免费| 2019中文字幕在线免费观看| 久久人人爽国产| 国产日韩欧美另类| 国产亚洲美女精品久久久| 国产精品黄视频| 亚洲级视频在线观看免费1级| 日本欧美爱爱爱| 亚洲视频综合网| 精品国产乱码久久久久酒店| 亚洲国产精品悠悠久久琪琪| 国产成人自拍视频在线观看| 久久久噜久噜久久综合| 国产一区二区久久精品| 成人av在线亚洲| 亚洲国产精品99| 日韩高清免费观看| 亚洲偷熟乱区亚洲香蕉av| 高跟丝袜欧美一区| 久久久久久久电影一区| 亚洲免费视频一区二区| www高清在线视频日韩欧美| 国产精品国产三级国产专播精品人| 68精品国产免费久久久久久婷婷| 亚洲伊人久久大香线蕉av| 九九热精品视频在线播放| 欧美激情视频一区二区| 久久6免费高清热精品| 日韩成人中文字幕| 亚洲精品98久久久久久中文字幕| 精品免费在线观看|