wcstombs 使用,支持中文档unicode

 

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. }  
void testTNL()
{
	char* old_locale = _strdup(setlocale(LC_CTYPE,NULL)); //store the old locale
	setlocale(LC_CTYPE,setlocale(LC_ALL,"")); //using the locale of the user env.

	const unsigned int nMaxPathLen = 255;
	wchar_t szPath[nMaxPathLen + 1] = {0};
    GetModuleFileName(NULL, szPath, nMaxPathLen);
    wchar_t   *p = wcsrchr(szPath, '\\');
    *p = 0;

	unsigned int _Dsize = (nMaxPathLen + 1) * 2;
	char *_Dest = new char[_Dsize];    
	memset(_Dest,0,_Dsize);

    wcstombs(_Dest,szPath,_Dsize);

	//restore the old locale.
	setlocale(LC_CTYPE, old_locale);
	free(old_locale);

	delete[] _Dest;
    _Dest = NULL;

}


阅读更多
文章标签: unicode wcstombs VC
个人分类: VC
上一篇小故事 网关、ARP、IP、MAC、路由的形象比喻
下一篇RTSP协议中文版
想对作者说点什么? 我来说一句

中文转unicode,相互转换utf8

2013年07月07日 3KB 下载

没有更多推荐了,返回首页

关闭
关闭