MultiByteToWideChar 字符转换问题

yaoohfox 2009-04-28 07:30:26
bool UTF8ToGB(CString &szOut ,CString str)
{
WCHAR *strSrc;
TCHAR *szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
strSrc = new WCHAR[i+1];
MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new TCHAR[i+1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
szOut = szRes;
delete []strSrc;
delete []szRes;
return true;
}
这个函数当项目属性设置为多字节编码的时候,可以成功运行。当项目属性设置为Unicode编码时,出错。被这个问题困扰了一整天。
请高手指教。
不知道的帮我顶下啊。
谢谢啦

...全文
171 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoohfox 2009-05-05
  • 打赏
  • 举报
回复
关于Unicode和UFT-8以及GB2312等多种编码格式转换,在不同的项目格式下,Unicode和MutilByte下编码现在已经解决了,多谢你们的帮助。
ok1234567 写的很好,谢谢了。
ok1234567 2009-04-30
  • 打赏
  • 举报
回复

char * UTF82Ansi(char *psz)
{

int iLen=strlen(psz)+1;
WCHAR * pbuf;
pbuf=new WCHAR[iLen];
if (MultiByteToWideChar( CP_UTF8, 0, psz, iLen,pbuf, (DWORD)iLen) == 0)
{
delete pbuf;
return NULL;
}
memset(psz,'\0',iLen);
if(WideCharToMultiByte(CP_ACP, 0, pbuf,-1,psz, iLen-1, NULL, NULL)==0)
{
delete pbuf;
return NULL;
}
delete pbuf;
return psz;
}

ok1234567 2009-04-30
  • 打赏
  • 举报
回复
CString 是程序项目编码相关的 MFC 类,
所有字符集编码转换函数必须使用与程序项目编码无关的数据类型!不能使用CString,TCHAR之类的数据类型管理变量/参数

使用char , WCHAR 等确定的数据类型
yaoohfox 2009-04-30
  • 打赏
  • 举报
回复
没人知道吗?
高人指点一下啊!
yaoohfox 2009-04-29
  • 打赏
  • 举报
回复
可能是我没说清楚,UTF8ToGB(CString &szOut ,CString str) 函数实现UTF8编码转GB2312编码。
agchen81 说CString采用TCHAR,所以导致出问题。受教了,以前确实没搞明白。
有哪位高人,帮我把函数修改下,。参数要是CString .--ahao--帮我该的参数是CStringA太麻烦了。
谢谢啦!
xghuzd 2009-04-28
  • 打赏
  • 举报
回复
用这样的函数就要明确CHAR或WCHAR,还要TCHAR.

如wchar_t 是宽的一个字符是16位。
如char是一个字符8位。

而TCHAR 在多字符下是char,在Uincode下是wchar_t
ahao 2009-04-28
  • 打赏
  • 举报
回复
// 帮你改了

bool UTF8ToGB(CStringA & szOut, CStringA str)
{
wchar_t * strSrc;
char * szRes;
int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
strSrc = new wchar_t[i+1];
MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);

i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new char[i+1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
szOut = szRes;
delete []strSrc;
delete []szRes;
return true;
}

// Test
CStringA str = _T("aaa鎴戜滑vbbb");
CStringA szOut;
bool ret = UTF8ToGB( szOut, str );
ASSERT( ret );
ASSERT( szOut == "aaa我们vbbb" );


liuzxchina 2009-04-28
  • 打赏
  • 举报
回复

在unicode模式下,TCHAR就是WCHAR

sunlin7 2009-04-28
  • 打赏
  • 举报
回复
用这样的函数就要明确CHAR或WCHAR,还要TCHAR.
agchen81 2009-04-28
  • 打赏
  • 举报
回复
不知道你有没有搞明白多字节编码和Unicode这两种模式。
在Unicode模式下,TCHAR自动解析为WCHAR,CString内部方法中也是使用TCHAR,所以默认字符也是WCHAR。
所以,不知道你在干什么。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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