程序中,如果要將ASCII碼字符串轉(zhuǎn)換為寬字符(Unicode),可以利用標(biāo)準(zhǔn)C的mbstowcs函數(shù)。
微軟在MSDN中有示例,如下:

然而,這段代碼在處理含有漢字的字符串時(shí)就會(huì)出現(xiàn)問(wèn)題。比如將:
wchar_t *pwchello = L"Hi"; 替換為wchar_t *pwchello = L"你好";
查看運(yùn)行結(jié)果就會(huì)發(fā)現(xiàn),mbstowcs函數(shù)將漢字視作兩個(gè)ASCII字符,這樣一個(gè)漢字就變成了兩個(gè)wchar_t。原因是mbstowcs需要我們明確的告訴他要轉(zhuǎn)換的字符語(yǔ)言。這里需要使用setlocale函數(shù)。在網(wǎng)上發(fā)現(xiàn)不少人遇到這個(gè)問(wèn)題,微軟的MSDN也是,為什么這里就不說(shuō)明一下呢?
只要在調(diào)用前,使用setlocale(LC_ALL, "chs")設(shè)置,結(jié)果就正常了。
我測(cè)試在英文Vista操作系統(tǒng)內(nèi),Visual Studio 2008下setlocale(LC_ALL, "chs")可以執(zhí)行成功。
但是在Borland C++Builder 6、CodeGear RAD Studio 2009下執(zhí)行都失敗,BCB提供的幫助文件內(nèi)也未找到,反復(fù)測(cè)試使用setlocale(LC_ALL, "Chinese (Simplified)_People's Republic of China")可以奏效(這么大一個(gè)長(zhǎng)串,BCB對(duì)搞中文編碼的程序員也夠狠)。
更諷刺的是,在BCB內(nèi)使用setlocale(LC_ALL, "jpn"),或"cht"都可以成功。唯獨(dú)就不支持"chs",對(duì)BCB的做法徹底無(wú)語(yǔ)了。我相信在大多數(shù)unix或linux上也還是支持"chs"的。如果有時(shí)間,我再搞一個(gè)MinGW試試看。
另外如果程序運(yùn)行在非中文操作系統(tǒng)內(nèi),使用setlocale修改運(yùn)行時(shí)字符集環(huán)境,會(huì)影響當(dāng)前應(yīng)用程序的編碼方式,因此使用前需要保留一下老的編碼,使用后再恢復(fù)。
for 在linux上coding的兄弟們,locale別名表大概在 /usr/lib/X11/locale/locale.alias