C++ 寬字符(wchar_t)與窄字符(char)的轉換


了解

長度

寬字符wchar_t的長度16位,可以用來顯示中文等除英文外的其他文字,

窄字符    char   的長度  8 位,只能處理英文。

哪里可以見到

在VS2010, 2012, 2013集成環境下面創建win32控制台工程后可以看到一個叫做 _tmain的主函數,其參數— int argc, _TCHAR* argv[],查看定義_TCHAR的定義就是wchar_t。

無標題

另外關於_tmain與main的區別,請看_tmain()和main()區別—lucyjiayou

轉換函數

頭文件 #include <stdlib>

函數原型

//寬字符轉換為窄字符

errno_t wcstombs_s(
   size_t *pReturnValue, //被修改的位數,作為返回的
   char *mbstr,          //轉換后字符串(窄)的空間指針
   size_t sizeInBytes,   //我暫時理解為,允許操作窄字符緩沖區的字符的個數,
                         //要比count大1,不能大過緩沖區最大長度
   const wchar_t *wcstr,  //指向要轉換的寬字符字符串
   size_t count ) ;         //要轉換的寬字符的個數;
 
//窄字符轉換為寬字符
errno_t mbstowcs_s(
   size_t *pReturnValue, //被修改的位數,作為返回的 
   wchar_t *wcstr,       //轉換后寬字符串的緩沖區指針
   size_t sizeInWords,   // 允許操作緩沖區中寬字符的個數
   const char *mbstr,    //指向要轉換的窄字符的字符串
   size_t count          //要轉換的窄字符的個數
);

 

操作

將寬字節的字符串轉換為窄字符的字符串

   1:  #include <string>
   2:  #include <cstdlib>
   3:   
   4:  std::string ws2s(const std::wstring& ws)
   5:  {
   6:      std::string curLocale = setlocale(LC_ALL, NULL);        // curLocale = "C";
   7:      setlocale(LC_ALL, "chs");                                             //中文地區
   8:      const wchar_t* _Source = ws.c_str();
   9:      size_t _Dsize =  ws.size() + 1;                                    //比要轉換的寬字符個數大1
  10:      char *_Dest = new char[_Dsize];
  11:      memset(_Dest, 0, _Dsize);                                          //初始化緩沖區
  12:      size_t   i;
  13:      wcstombs_s(&i, _Dest, _Dsize, _Source, ws.size());
  14:      std::cout << "i:" << i << std::endl;                          
  15:      std::string result = _Dest;
  16:      delete[]_Dest;
  17:      setlocale(LC_ALL, curLocale.c_str());                               //設置回原來的locale
  18:      return result;
  19:  }

將窄字節的字符串轉換為寬字符的字符串

   1:  std::wstring s2ws(const std::string& s)
   2:  {
   3:      std::string curlLocale = setlocale(LC_ALL,NULL);
   4:      setlocale(LC_ALL, "chs");
   5:      const char* _Source = s.c_str();
   6:      size_t _Dsize = s.size() + 1;
   7:   
   8:      wchar_t* _Dest = new wchar_t[_Dsize];
   9:      size_t i;
  10:      mbstowcs_s(&i, _Dest, _Dsize, _Source, s.size());
  11:      std::wstring result = _Dest;
  12:      delete[] _Dest;
  13:      setlocale(LC_ALL, curlLocale.c_str());
  14:      return result;
  15:  }

注意:窄字符與寬字符轉換時要注意locale的轉換,保存,與還原。


免責聲明!

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



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