VC Const char * 转为 WCHAR 的问题

微wx笑
Java领域优质创作者
博客专家认证
2012-03-07 02:58:30
代码如下:

#include "StdAfx.h"
#include "aw.h"
#include "windows.h"

namespace
{
wchar_t* Ansi2Unicode(const char* szAnsi)
{
CHECK_RET(!szAnsi, NULL)

// 预转换,得到所需空间的大小
int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);
// 分配空间要给'/0'留个空间,MultiByteToWideChar不会给'/0'空间
wchar_t* wszString = new wchar_t[wcsLen+1];
CHECK_RET(!wszString, NULL)
::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);
// 最后加上结束符'/0'
wszString[wcsLen] = L'/0';
return wszString;
}

char* Unicode2Ansi(const wchar_t* wszString)
{
CHECK_RET(!wszString, NULL)

int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
char* szAnsi = new char[ansiLen + 1];
CHECK_RET(!szAnsi, NULL)
// Unicode版对应的strlen是wcslen
::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);
// 最后加上'/0'
szAnsi[ansiLen] = '/0';
return szAnsi;
}
}


代码出处:http://blog.csdn.net/xjanker2/article/details/5737554


请问“CHECK_RET”是一个宏吗?
应该包含哪个头文件?

另外,

// 最后加上结束符'/0'
wszString[wcsLen] = L'/0';

编译时会产生:warning C4066: characters beyond first in wide-character constant ignored

是什么原因呢?如何解决?
...全文
560 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2013-04-15
  • 打赏
  • 举报
回复
CHECK_RET显然是一个宏,猜测:
#define CHECK_RET(check, ret) {if (check) return (ret);}
「已注销」 2013-04-14
  • 打赏
  • 举报
回复

#include "StdAfx.h"   
#include "aw.h"   
#include "windows.h"   
  
namespace  
{  
    wchar_t* Ansi2Unicode(const char* szAnsi)  
    {  
        if ( wszString == NULL )
                 return  NULL; 
  
        // 预转换,得到所需空间的大小       
        int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), NULL, 0);  
        // 分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间       
        wchar_t* wszString = new wchar_t[wcsLen+1];  
        CHECK_RET(!wszString, NULL)  
        ::MultiByteToWideChar(CP_ACP, NULL, szAnsi, strlen(szAnsi), wszString, wcsLen);   
        // 最后加上结束符'\0'       
        wszString[wcsLen] = L'\0';  
        return wszString;  
    }  
  
    char* Unicode2Ansi(const wchar_t* wszString)  
    {  
         if ( wszString == NULL )
                 return  NULL;
  
        int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);  
        char* szAnsi = new char[ansiLen + 1];   
        CHECK_RET(!szAnsi, NULL)  
        // Unicode版对应的strlen是wcslen    
        ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcslen(wszString), szAnsi, ansiLen, NULL, NULL);   
        // 最后加上'\0'    
        szAnsi[ansiLen] = '\0';  
        return szAnsi;  
    }  
}  
这代码写的相当的搓,首先哪会最后填零啊,必须事先ZeroMemory填冲嘛,第二WideMulti函数,第四个参数直接填入-1,系统会自己计算长度的,第三嘛,就一个代码页转,这个转码的CP_ACP在参数里面会好很多,编码不一定就这两种,gbk编码转wchar怎么办
kyotrue 2012-03-07
  • 打赏
  • 举报
回复
用CString的构造函数就能转了。。。想转成UNICODE用CStringW,想转成多字节用CStringA,唯一的限制就是多字节只能使用APP当前的locale。
微wx笑 2012-03-07
  • 打赏
  • 举报
回复
// 最后加上结束符'/0'
wszString[wcsLen] = L'/0';

编译时会产生:warning C4066: characters beyond first in wide-character constant ignored

这个问题原来是斜杠的问题,改为:wszString[wcsLen] = L'\0'; 问题解决。

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧