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 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); //轉換寬字符為單字符
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;
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);
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];
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 );
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 個。
因為在 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 個。
http://www.voidcn.com/article/p-zvvjuyhw-ra.html