setlocale同mbstowcs函式的關係

2021-06-27 22:55:23 字數 3339 閱讀 8291

setlocale同mbstowcs函式的關係

程式中,如果要將ascii碼字串轉換為寬字元(unicode),可以利用標準c的mbstowcs函式。

然而,這段**在處理含有漢字的字串時就會出現問題。

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

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

配置地域化資訊。

語法:string setlocale(string category, string locale);

返回值: 字串

函式種類: 作業系統與環境

內容說明

本函式用來配置地域的資訊。引數 category 有下列的選擇:

而引數 locate 若是空字串 "",則會使用系統環境變數的 locate 或是 lang 的值。若 locate 為零,則不會改變地域化配置。返回新的地域,若系統尚未實作則返回 false。

單字元寬字元互相轉換

#include

size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n);   //轉換單字串為寬字串

size_t wcstombs(char *mbstr,   const wchar_t *wcstr,   size_t count );  //轉換寬字串為單字串

例如:cstring str = l"hello";

char sss[20];

wcstombs(sss,str.getbuffer(),20);              //轉換寬字元為單字元

stl 寬字元到 單字元轉換

wstring str = l"hello";

std::wstring::size_type len = str.length();

std::string s(len*2,0);

size_t total = wcstombs(&s[0],str.c_str(),len*2);

s[total] = ''''/0''

return s;

mbtowc 和 wctomb 是單個字元相互轉換

int len;

setlocale (lc_all, "chs");  //設定為簡體中文環境

wchar_t wc = l''''中''

wprintf(l"1個寬中文字元:%c /n",wc);

char* p = "中";

len = mbtowc (&wc, p, mb_len_max);

wprintf(l"單字串轉換為1個寬字元:%c 長度: %d/n",wc,len);

char pcmb[mb_len_max];

len = wctomb (pcmb, wc);

pcmb[len] = 0;

printf("寬字元轉換為單字串:%s 長度:%d/n",pcmb,len);

byte utf8[1024];        //utf8 字串

wchar_t wstr[1024];

char mstr[1024];

//utf-8 轉換為寬字元

multibytetowidechar( cp_utf8, 0, utf8,1024, wstr, sizeof(wstr)/sizeof(wstr[0]) );

widechartomultibyte( cp_acp,0,wstr,-1,mstr,1024,null,null );

注:mbstowcs()是c庫函式,要正確的設定locale才能進行轉換,multibytetowidechar()是win32函式,別搞混了!

為什麼一定要呼叫

setlocale

呢?因為在

c/c++

語言標準中定義了其執行時的字符集環境為

"c",也就是

ascii

字符集的乙個子集,那麼

mbstowcs

在工作時會將

cstr

中所包含的字串看作是

ascii

編碼的字元,而不認為是乙個包含有

chs編碼的字串,所以他會將每乙個中文拆成2個

ascii

編碼進行轉換,這樣得到的結果就是會形成4個

wchar_t

的字元組成的串,那麼如何才能夠讓

mbstowcs

正常工作呢?在呼叫

mbstowcs

進行轉換之間必須明確的告訴

mbstowcs

目前cstr

串中包含的是

chs編碼的字串,通過

setlocale( lc_all, "chs" )

函式呼叫來完成,需要注意的是這個函式會改變整個應用程式的字符集編碼方式,必須要通過重新呼叫

setlocale( lc_all, "c" )

函式來還原,這樣就可以保證

mbstowcs

在轉換時將

cstr

中的串看作是中文串,並且轉換成為2個

wchar_t

字元,而不是4個。

setlocale 配置地域化資訊

語法 char setlocale int category,const char locale 返回值 字串 函式種類 作業系統與環境 內容說明 本函式用來配置地域的資訊,設定當前程式使用的本地化資訊。引數 category 有下列的選擇 lc all 包括下面的全部選項都要。lc collate...

setlocale 函式測試當前語言的兩個程式

setlocale 函式是用來配置地域資訊的,原本以為這個也是windows函式,結果居然是c 的標準函式,其標頭檔案為,按照一般的原則,所有原本c的函式被移植到c 標準庫中時,是按照去掉後面的.h,前面加上c這樣的原則。舉例 變成,所以我猜也是這樣,但是沒有繼續去確認。從示例2上看,猜想是正確的 ...

VBS中的SetLocale函式到底有什麼用?

vbs文件中對setlocale函式的描述 設定全球區域設定,並返回以前的區域設定。乙個 locale 是使用者參考資訊集合,與使用者的語言 國家 地區和文化傳統有關。該 locale 決定鍵盤布局 字www.cppcns.com母排序順序和日期 時間 數字與貨幣格式。簡單的說,就是vbs中的一些函...