关闭

wcstombs 使用,支持中文档unicode

标签: unicodewcstombs VC
611人阅读 评论(0) 收藏 举报
分类:

 

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. }  


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:17324次
    • 积分:214
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:8篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论