请问哪位高人有gb转UTF-8的MFC代码,谢谢

zy2015036 2011-06-26 07:22:38
网上找了一圈,都不好用的..
gb转UTF-8的..
谢谢大家了.
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcyw 2011-06-27
  • 打赏
  • 举报
回复
int ConvertStringToUTF8 (LPCTSTR lpSource,int nDataLen, LPSTR lpUtf8)
{
int nCodePage = 936;
if (NULL == lpSource || NULL == lpUtf8)
return E_INVALIDARG;
int nWideCharCount = 0;

DWORD dwError = 0;
WCHAR *pWideChar = NULL;

int nRet = MultiByteToWideChar (nCodePage, 0, lpSource, nDataLen, NULL, nWideCharCount);
if (0 == nRet)
{
dwError = GetLastError ();
return -1;
}
nWideCharCount = nRet + 2;
pWideChar = new WCHAR [nWideCharCount];
if (NULL == pWideChar)
return -2;

nRet = MultiByteToWideChar (nCodePage, 0, lpSource, nDataLen, pWideChar, nWideCharCount);
if (0 == nRet)
{
dwError = GetLastError ();
SAFE_ARRAYDELETE (pWideChar);
return -3;
}
nWideCharCount = nRet;
int nUtf8Len = 0;

nRet = WideCharToMultiByte(CP_UTF8, 0, pWideChar, nWideCharCount, lpUtf8, nUtf8Len, 0, 0);
if (0 == nRet)
{
dwError = GetLastError ();
SAFE_ARRAYDELETE (pWideChar);
return -4;
}
nUtf8Len = nRet + 2;
nRet = WideCharToMultiByte(CP_UTF8, 0, pWideChar, nWideCharCount, lpUtf8, nUtf8Len, 0, 0);
if (0 == nRet)
{
dwError = GetLastError ();
SAFE_ARRAYDELETE (pWideChar);
return -4;
}

SAFE_ARRAYDELETE (pWideChar);

return nRet;

}

int ConvertUTF8ToString (LPCTSTR lpUtf8,int nDataLen, LPSTR lpDest)
{
int nCodePage = 936;
if (NULL == lpDest || NULL == lpUtf8)
return E_INVALIDARG;

int nWideCharCount = 0;
DWORD dwError = 0;
WCHAR *pWideChar = NULL;
int nRet = MultiByteToWideChar (CP_UTF8, 0, lpUtf8, nDataLen, NULL, nWideCharCount);
if (0 == nRet)
{
dwError = GetLastError ();
return -1;
}
nWideCharCount = nRet + 2;
pWideChar = new WCHAR [nWideCharCount];
if (NULL == pWideChar)
return -2;
nRet = MultiByteToWideChar (CP_UTF8, 0, lpUtf8,nDataLen, pWideChar, nWideCharCount);
if (0 == nRet)
{
dwError = GetLastError ();
SAFE_ARRAYDELETE (pWideChar);
return -3;
}
nWideCharCount = nRet;
int nDestLen = 0;
nRet = WideCharToMultiByte(nCodePage, 0, pWideChar, nWideCharCount, lpDest, nDestLen, 0, 0);
if (0 == nRet)
{
dwError = GetLastError ();
SAFE_ARRAYDELETE (pWideChar);
return -4;
}
nDestLen = nRet + 2;
nRet = WideCharToMultiByte(nCodePage, 0, pWideChar, nWideCharCount, lpDest, nDestLen, 0, 0);
if (0 == nRet)
{
dwError = GetLastError ();
SAFE_ARRAYDELETE (pWideChar);
return -4;
}
SAFE_ARRAYDELETE (pWideChar);
return nRet;
}

zy2015036 2011-06-27
  • 打赏
  • 举报
回复
我知道我错误出在哪里了..我把这个函数放在了LRESULT CALLBACK中调用...结果提示了
找不到标识符
这个错误..
zy2015036 2011-06-26
  • 打赏
  • 举报
回复
..................
我明白了....
zwfgdlc 2011-06-26
  • 打赏
  • 举报
回复
我发的一样,不要void CAotoCallDlg::GbkToUtf8(CHAR* GbkStr, CHAR* Utf8Str)
再不明白,你面壁三天吧.
zy2015036 2011-06-26
  • 打赏
  • 举报
回复
afx_msg void GbkToUtf8(CHAR* GbkStr, CHAR* Utf8Str);
也不对啊.
zy2015036 2011-06-26
  • 打赏
  • 举报
回复
请问弄全局是啥意思的..
我复制了你的函数是一样的啊
用户 昵称 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zy2015036 的回复:]
请教各位高人,我半年没写代码了,
提示这个error C3861: “GbkToUtf8”: 找不到标识符
我是这么写这个函数的..
void CAotoCallDlg::GbkToUtf8(CHAR* GbkStr, CHAR* Utf8Str)
{
INT cchWideChar = 0;
LPWSTR lpWideCharStr = NULL;
INT cbMultiByteS……
[/Quote]
你弄个全局的就行了,用什么成员函数啊。
  • 打赏
  • 举报
回复
有个简单的 你可以用CMarkup 中的AToUTF8
zy2015036 2011-06-26
  • 打赏
  • 举报
回复
请教各位高人,我半年没写代码了,
提示这个error C3861: “GbkToUtf8”: 找不到标识符
我是这么写这个函数的..
void CAotoCallDlg::GbkToUtf8(CHAR* GbkStr, CHAR* Utf8Str)
{
INT cchWideChar = 0;
LPWSTR lpWideCharStr = NULL;
INT cbMultiByteStr = 0;

cchWideChar = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, GbkStr, -1, lpWideCharStr, 0);
lpWideCharStr = new WCHAR[cchWideChar];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, GbkStr, -1, lpWideCharStr, cchWideChar);

cbMultiByteStr = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, -1, Utf8Str, 0, 0, FALSE);
WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, -1, Utf8Str, cbMultiByteStr, 0, 0);

delete [] lpWideCharStr;
}
头文件这么写的
void GbkToUtf8(CHAR* GbkStr, CHAR* Utf8Str);
哪里错了嘛- -半年没写果然忘光了
ZhouBoTong 2011-06-26
  • 打赏
  • 举报
回复
mark
zwfgdlc 2011-06-26
  • 打赏
  • 举报
回复

void GbkToUtf8(CHAR* GbkStr, CHAR* Utf8Str)
{
INT cchWideChar = 0;
LPWSTR lpWideCharStr = NULL;
INT cbMultiByteStr = 0;

cchWideChar = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, GbkStr, -1, lpWideCharStr, 0);
lpWideCharStr = new WCHAR[cchWideChar];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, GbkStr, -1, lpWideCharStr, cchWideChar);

cbMultiByteStr = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, -1, Utf8Str, 0, 0, FALSE);
WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, -1, Utf8Str, cbMultiByteStr, 0, 0);

delete [] lpWideCharStr;
}


随便写的,自己有需要改进下。
用法:

CHAR utf8[256] = {0};
GbkToUtf8("中国", utf8);
kyotrue 2011-06-26
  • 打赏
  • 举报
回复
MultiByteToWideChar先把GB转换成UNICODE,然后WideCharToMultiByte把UNICODE转换成UTF-8
查MSDN可获知CodePage的值
zy2015036 2011-06-26
  • 打赏
  • 举报
回复
有代码吗楼上的高人..我就是找不见代码 不会啊..
zwfgdlc 2011-06-26
  • 打赏
  • 举报
回复
首先要把GBK转志UNICODE,再UNICODE转UTF8.

16,472

社区成员

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

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

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