请问各位高手,我用了别人的GB转UTF-8代码,但是转换后不对.

zy2015036 2011-06-27 04:25:48
我用了别人的GB转UTF-8代码,但是转换后和我实际要的转化效果是不一样的,调试运行发现转换的就不对.
请高手们帮我看看哪里错了.(不是代码运行错误,是转换后的结果和我要的UTF-8编码不一致.)

G转U的函数代码:

char* CAotoCallDlg::G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr)
delete[] wstr;
return str;
}


头文件
char* G2U(const char* gb2312);

调用方式:
CString st,str;
GetDlgItemText(IDC_NEDIT,st);
char* ch =(char*)st.GetBuffer(st.GetLength());
char* chname = G2U(ch);
正确的应该是这样的:
魔兽争霸 ---- 榄斿吔浜夐湼
但是用上面的代码转换出的不是这样的.
请高手给看看.
...全文
78 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yyyyy_3 的回复:]

memset(wstr, 0, 2*(len+1));
[/Quote]
这里是有个bug,其他的没看出来呢
zy2015036 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yyyyy_3 的回复:]

char* chname = G2U("测试");

直接试
[/Quote]
直接转也不对啊.
yyyyy_3 2011-06-27
  • 打赏
  • 举报
回复
char* chname = G2U("测试");

直接试
yyyyy_3 2011-06-27
  • 打赏
  • 举报
回复
memset(wstr, 0, 2*(len+1));
yyyyy_3 2011-06-27
  • 打赏
  • 举报
回复
函数没有一点问题,是对的.
应该是调用时出错了.
用户 昵称 2011-06-27
  • 打赏
  • 举报
回复
//**************************************
// unicode字符串转utf8字符串
// 返回大于0成功,小于0失败
//**************************************
int
ustr_u8str( WCHAR *unicodestr, char *utf8str )
{
int result = 0;
try
{
int needlen = WideCharToMultiByte( CP_UTF8, 0, unicodestr, -1, NULL, 0, NULL, NULL );
if( needlen < 0 )
{
return needlen;
}

result = WideCharToMultiByte( CP_UTF8, 0, unicodestr, -1, utf8str, needlen + 1, NULL, NULL );
if( result < 0 )
{
return result;
}
return ( result - 1 );
}
catch( ... )
{
ShowError();
}
return result;
}

//**************************************
// ansi字符串转unicode字符串
// 返回大于0成功,小于0失败
//**************************************
int
astr_ustr( char *ansistr, WCHAR *unicodestr )
{
int result = 0;
try
{
int needlen = MultiByteToWideChar( g____ansi_codepage, 0, ansistr, -1, NULL, 0 );
if( needlen < 0 )
{
return needlen;
}

result = MultiByteToWideChar( g____ansi_codepage, 0, ansistr, -1, unicodestr, needlen );
if( result < 0 )
{
return result;
}
return result;
}
catch( ... )
{
ShowError();
}
return result;
}


懒得合并成一个函数,发两个函数配合一下吧,先astr_ustr再ustr_u8str
zy2015036 2011-06-27
  • 打赏
  • 举报
回复
那转出来咋不是这个的...我弄了两天了..头疼啊..
Eleven 2011-06-27
  • 打赏
  • 举报
回复
GB转UTF8,是先MultiByteToWideChar(CP_ACP,...)转成Unicode编码,然后将Unicode转成UTF8,WideCharToMultiByte(CP_UTF8,...);

你上面的代码好像没有错~

16,471

社区成员

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

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

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