char字符与wchar_t字符的相互转换,以及wchar_t字符串的常用用法

   今天在做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;}

 

//将单字节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'结尾的目标字符串

                  const wchar_t *strSource //'\0'结尾的源字符串
                       );
  用法:#include <stdlib.h>
  功能:把strSource所指字符串添加到strDestination结尾处,覆盖strDestination结尾处的'\0'并添加'\0'。
  说明:strSource和strDestination所指内存区域不可以重叠且strDestination必须有足够的空间来容纳strSource的字符串。
  返回值 : 返回指向strDestination的指针. No return value is reserved to indicate an error.
  备注 : 因为wcscat在strDestination追加strSource前不进行检查,这是一个缓冲区溢出的潜在原因。故使用时应注意。推荐使用wcscat_s替代.

      2、wcslen() 统计wchar_t型字符串的长度,需要00作为结束符来统计长度。类似strlen()函数的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值