现在的位置: 首页 > 综合 > 正文

wcstombs 使用,支持中文档unicode wcstombs 使用之二,支持中文当unicode

2017年10月27日 ⁄ 综合 ⁄ 共 1626字 ⁄ 字号 评论关闭

 

wcstombs 使用之二,支持中文当unicode

        当你调试进入源码,你会发现wcstombs 这个函数是和locale有关的。locale如果设置不对,那么程序运行将不能得到预期结果。
当C语言程序初始化时(刚进入到 main() 时),locale 被初始化为默认的 C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,是用来书写C语言源程序的最小字符集(所以才起locale名叫:C)。
也就是说,默认locale是C,字符集是ascii。
当我们的输入是一组带有中文或者其他字符的字符串时候,他就会截断。只会转化前面的ascii字符。
所以在中文路径下是不能work的。
如果我们存在中文路径,或者字符,想使用wcstombs该函数来将宽字符串转为多字节字符串,那么我们就得设置系统的当前环境的locale.
主要是使用setlocale这个函数以及两个标记 LC_CTYPE, LC_ALL.

示例代码如下:

  1. void testTNL()  
  2. {  
  3.     char* old_locale = _strdup(setlocale(LC_CTYPE,NULL)); //store the old locale
      
  4.     setlocale(LC_CTYPE,setlocale(LC_ALL,"")); //using the locale of the user env.
      
  5.   
  6.     const unsigned int nMaxPathLen = 255;  
  7.     wchar_t szPath[nMaxPathLen + 1] = {0};  
  8.     GetModuleFileName(NULL, szPath, nMaxPathLen);  
  9.     wchar_t   *p = wcsrchr(szPath, '\\');  
  10.     *p = 0;  
  11.   
  12.     unsigned int _Dsize = (nMaxPathLen + 1) * 2;  
  13.     char *_Dest = new char[_Dsize];      
  14.     memset(_Dest,0,_Dsize);  
  15.   
  16.     wcstombs(_Dest,szPath,_Dsize);  
  17.   
  18.     //restore the old locale.   
  19.     setlocale(LC_CTYPE, old_locale);  
  20.     free(old_locale);  
  21.   
  22.     delete[] _Dest;  
  23.     _Dest = NULL;  
  24.   
  25. }  

抱歉!评论已关闭.