1. 程式人生 > >為什麼一定要呼叫 setlocale 呢? 因為在 C/C++ 語言標準中定義了其執行時的字符集環境為 "C" ,也就是 ASCII 字符集的一個子集。使用setlocal改變整個應用程式的字符集編碼方式(wcstombs使用前要設定 setlocale (LC_ALL, &qu

為什麼一定要呼叫 setlocale 呢? 因為在 C/C++ 語言標準中定義了其執行時的字符集環境為 "C" ,也就是 ASCII 字符集的一個子集。使用setlocal改變整個應用程式的字符集編碼方式(wcstombs使用前要設定 setlocale (LC_ALL, &qu

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