1. 程式人生 > >setlocale同mbstowcs函式的關係(VS2008下setlocale(LC_ALL, "chs")可以執行成功,BCB使用setlocale(LC_ALL, "Chinese (Simplified)_People's Republic of Chi

setlocale同mbstowcs函式的關係(VS2008下setlocale(LC_ALL, "chs")可以執行成功,BCB使用setlocale(LC_ALL, "Chinese (Simplified)_People's Republic of Chi

序中,如果要將ASCII碼字串轉換為寬字元(Unicode),可以利用標準C的mbstowcs函式。

微軟在MSDN中有示例,如下:

 

然而,這段程式碼在處理含有漢字的字串時就會出現問題。比如將:

wchar_t *pwchello = L"Hi";  替換為wchar_t *pwchello = L"你好"; 

檢視執行結果就會發現,mbstowcs函式將漢字視作兩個ASCII字元,這樣一個漢字就變成了兩個wchar_t。原因是mbstowcs需要我們明確的告訴他要轉換的字元語言。這裡需要使用setlocale函式。在網上發現不少人遇到這個問題,微軟的MSDN也是,為什麼這裡就不說明一下呢?

只要在呼叫前,使用setlocale(LC_ALL, "chs")設定,結果就正常了。

我測試在英文Vista作業系統內,Visual Studio 2008下setlocale(LC_ALL, "chs")可以執行成功。

但是在Borland C++Builder 6、CodeGear RAD Studio 2009下執行都失敗,BCB提供的幫助檔案內也未找到,反覆測試使用setlocale(LC_ALL, "Chinese (Simplified)_People's Republic of China")可以奏效(這麼大一個長串,BCB對搞中文編碼的程式設計師也夠狠)。

更諷刺的是,在BCB內使用setlocale(LC_ALL, "jpn"),或"cht"都可以成功。唯獨就不支援"chs",對BCB的做法徹底無語了。我相信在大多數unix或linux上也還是支援"chs"的。如果有時間,我再搞一個MinGW試試看。

另外如果程式執行在非中文作業系統內,使用setlocale修改執行時字符集環境,會影響當前應用程式的編碼方式,因此使用前需要保留一下老的編碼,使用後再恢復。

 

for 在linux上coding的兄弟們,locale別名表大概在 /usr/lib/X11/locale/locale.alias

http://www.cppblog.com/fwxjj/archive/2010/05/25/116303.html