為什么一定要調用 setlocale 呢? 因為在 C/C++ 語言標准中定義了其運行時的字符集環境為 "C" ,也就是 ASCII 字符集的一個子集。使用setlocal改變整個應用程序的字符集編碼方式(wcstombs使用前要設置 setlocale (LC_ALL, "chs"); )


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 個。
http://www.voidcn.com/article/p-zvvjuyhw-ra.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM