char字符与wchar_t字符的相互转换,以及wchar_t字符串的常用用法
2016-05-31 21:24
483 查看
今天在做word报表的自动生成时,在读取数据文档的数据插入表格的时候,因为wordSelection.TypeText(LPCTSTR * text),需要传入的是LPCTSTR型的字符串(查看定义可知这是一个WCHAR型的数据),但infile文件流没有重载“>>”运算符,所以需要转换,开始我想到的是强制转换,但强制转换的结果就是在word文档里显示的是乱码(猜测可能是因为wchar_t占两字节,而char占一个字节,所以会有额外的未初始化的内存载入的情况,可以先分配一个wchar_t类型大小的内存,然后用memset()函数初始化内存,在把char型数据占用内存的数据复制过去)。当然,我也在网上查到了相应的转换函数:
1、char*转wchar_t* 和wchar_t*转char*的函数
<pre name="code" class="cpp">//将单字节char*转化为宽字节wchar_t*wchar_t* c2w(const char *str){ int length = strlen(str)+1; wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length); memset(t,0,length*sizeof(wchar_t)); MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length); return t;}
2、char[] 转换为LPWSTR型
解决方案:
思路一:
使用CA2W字符转换宏(ATL and MFC String ConversionMacros)。
根据MSDN描述,这个宏用于将ANSI转换为Wide Character(UNICODE)
代码如下:
LPWSTR aaa = CA2W(text);
item.pszText = aaa;
思路二:
使用intMultiByteToWideChar()函数。根据MSDN描述,这个方法:This
function maps a character string to awide-character (Unicode)
string。
代码如下:
TCHAR aaa[31];
MultiByteToWideChar(0,0,text,31,aaa,62);
3、wchar_t* 的常用操作:
1、wcscat是连接宽字符串的,和strcat功能类似,用于把两个wchar_t型的数据连接起来
2、wcslen() 统计wchar_t型字符串的长度,需要00作为结束符来统计长度。类似strlen()函数的使用。
1、char*转wchar_t* 和wchar_t*转char*的函数
<pre name="code" class="cpp">//将单字节char*转化为宽字节wchar_t*wchar_t* c2w(const char *str){ int length = strlen(str)+1; wchar_t *t = (wchar_t*)malloc(sizeof(wchar_t)*length); memset(t,0,length*sizeof(wchar_t)); MultiByteToWideChar(CP_ACP,0,str,strlen(str),t,length); return t;}
//将单字节char*转化为宽字节wchar_t* wchar_t* AnsiToUnicode( const char* szStr ) { int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 ); if (nLen == 0) { return NULL; } wchar_t* pResult = new wchar_t[nLen]; MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen ); return pResult; }
//将宽字节wchar_t*转化为单字节char* inline char* UnicodeToAnsi( const wchar_t* szStr ) { int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL ); if (nLen == 0) { return NULL; } char* pResult = new char[nLen]; WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL ); return pResult; }
2、char[] 转换为LPWSTR型
解决方案:
思路一:
使用CA2W字符转换宏(ATL and MFC String ConversionMacros)。
根据MSDN描述,这个宏用于将ANSI转换为Wide Character(UNICODE)
代码如下:
LPWSTR aaa = CA2W(text);
item.pszText = aaa;
思路二:
使用intMultiByteToWideChar()函数。根据MSDN描述,这个方法:This
function maps a character string to awide-character (Unicode)
string。
代码如下:
TCHAR aaa[31];
MultiByteToWideChar(0,0,text,31,aaa,62);
3、wchar_t* 的常用操作:
1、wcscat是连接宽字符串的,和strcat功能类似,用于把两个wchar_t型的数据连接起来
原型:_INTRIMP wchar_t *wcscat(
wchar_t *strDestination, //'\0'结尾的目标字符串
2、wcslen() 统计wchar_t型字符串的长度,需要00作为结束符来统计长度。类似strlen()函数的使用。
相关文章推荐
- android studio构建项目一直卡在gradle build running界面
- Unity让调试更加简单(一)
- hdoj2571【DP基础】
- hdu_2955_Robberies(01背包)
- hiho_1079_离散化
- epoll实现socket通信
- 寻址方式
- change backgroud color of the windows in ubuntu
- Linux Centos的Inode及Block相关知识
- 校个人赛——02
- 2016届毕业设计(论文) 基本规范及档案袋封面填写要求
- Codeforces Round #347 (Div. 2) B. Rebus
- sdut第八届校赛--小厚的三角形
- 三次学习ssession和cookie
- 线性规划求解路径问题
- VC++动态链接库编程之MFC DLL
- Intent的用法
- Matlab 图像预处理
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别
- linux 终端常用快捷键