為什麼一定要呼叫 setlocale 呢? 因為在 C/C++ 語言標準中定義了其執行時的字符集環境為 "C" ,也就是 ASCII 字符集的一個子集。使用setlocal改變整個應用程式的字符集編碼方式(wcstombs使用前要設定 setlocale (LC_ALL, &qu
阿新 • • 發佈:2019-01-09
setlocale
配置地域化資訊。
語法: string setlocale(string category, string locale);
返回值: 字串
函式種類: 作業系統與環境
|
|
內容說明 |
本函式用來配置地域的資訊。引數 category 有下列的選擇:
- LC_ALL 包括下面的全項選項都要。
- LC_COLLATE 配置字串比較,PHP 目前尚未實作出來本項。
- LC_CTYPE 配置字元類別及轉換。例如全變大寫 strtoupper()。
- LC_MONETARY 配置金融貨幣,PHP 目前尚未實作。
- LC_NUMERIC 配置小數點後的位數。
- LC_TIME 配置時間日期格式,與 strftime() 合用。
而引數 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 個。