unicode转utf8当字符串内出现“踏”字的时候中文乱码

长空行影 2018-10-13 03:26:39
以下是我用的转换函数 也都是在网上找到的和般情况下是没有问题的 ,可是如何字符串中存在“踏”字的时候就出现乱码,请各位看一下是怎么回事。。。
测试字符串: "防踩踏#19#res\Media\图片\JPG\防踩踏.jpg#JPG#5#1#1#0

void CFileServerDlg::ANSItoUTF8(CString &strAnsi)
{

USES_CONVERSION;
char * stransi = W2A(strAnsi);
//获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页
UINT nLen = MultiByteToWideChar(CP_ACP, NULL, stransi, -1, NULL, NULL);
WCHAR *wszBuffer = new WCHAR[nLen + 1];
memset(wszBuffer, 0, nLen+1);
nLen = MultiByteToWideChar(CP_ACP, NULL, stransi, -1, wszBuffer, nLen);
wszBuffer[nLen] = 0;
//获取转为UTF8多字节后需要的缓冲区大小,创建多字节缓冲区
nLen = WideCharToMultiByte(CP_UTF8, NULL, wszBuffer, -1, NULL, NULL, NULL, NULL);
CHAR *szBuffer = new CHAR[nLen + 1];
memset(szBuffer, 0, nLen+1);
nLen = WideCharToMultiByte(CP_UTF8, NULL, wszBuffer, -1, szBuffer, nLen, NULL, NULL);
szBuffer[nLen] = 0;
string szbuffer = szBuffer;

strAnsi = szbuffer.c_str();
//内存清理
delete[]wszBuffer;
delete[]szBuffer;
}

CString CFileServerDlg::UnicodeToUtf8(CString Unicodestr)
{
wchar_t* unicode = Unicodestr.AllocSysString();
int len;
len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
char *szUtf8 = (char*)malloc(len + 1);
memset(szUtf8, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
string result = szUtf8;
CString utfstr=CString(result.c_str());
free(szUtf8);
return utfstr;
}
...全文
179 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
长空行影 2018-10-13
  • 打赏
  • 举报
回复
谢谢了啊 二楼给出解决办法的哥们。呵呵 原因找到了 是我后期的代码对数据的处理有问题与unicode-->unf8无关 后期处理是保存字符串到INI文件(以UTF8编码保存) 还是谢谢你。一会上分给你。

看到网上有很多问怎么存为utf8格式INI文的,下面我说一下我的具体操作步骤,望给遇到同样问题的人一个解决办法:
前提我的环境:unicode编码环境下 MFC程序

1、执行unicode 转 utf8

string CFileServerDlg::UnicodeToUtf8(CString Unicodestr)
{
wchar_t* unicode = Unicodestr.GetBuffer();
int len;
len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);
char *szUtf8 = (char*)malloc(len + 1);
memset(szUtf8, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, unicode, -1, szUtf8, len, NULL, NULL);
string result = szUtf8;
free(szUtf8);
return result;
}

2、用::WritePrivateProfileStringA(string.c_str(),string.c_str(),string.c_str(),string.c_str());
就可以了
注:在unicode环境下不要用WritePrivateProfileString 因为有的文字会出现乱码,我这次遇到的就是这样的问题。
zgl7903 2018-10-13
  • 打赏
  • 举报
回复

int StringToUtf8(LPCTSTR strIn, LPSTR pstrUtf8, int iUTF8BuffLen, UINT cpCode=CP_THREAD_ACP)
{
int iConvRet = 0;

//strIn先转换到UNICODE
WCHAR *pWString = NULL;
#if (defined UNICODE || defined _UNICODE) //UNICODE
pWString = strIn;
#else //!UNICODE
int iSrcLen = MultiByteToWideChar(cpCode, 0, strIn, -1, NULL, 0);
pWString = new WCHAR[iSrcLen + 1];
MultiByteToWideChar(cpCode, 0, strIn, -1, pWString, iSrcLen);
pWString[iSrcLen] = 0;
#endif //

//UNICODE转换到UTF8
iConvRet = WideCharToMultiByte(CP_UTF8, 0, pWString, -1, pstrUtf8, iUTF8BuffLen, NULL, NULL);

//结束清理
#if !(defined UNICODE || defined _UNICODE)
delete [] pWString; pWString = NULL;
#endif //UNICODE

return iConvRet;
}

int Utf8ToString(LPCSTR strUtf8, LPTSTR pStrBuffer, int iStrBuffLen, UINT cpCode=CP_THREAD_ACP)
{
int iConvRet = 0;

#if (defined UNICODE || defined _UNICODE) //UNICODE
//UTF8 转换到 Unicode
iConvRet = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, pStrBuffer, iStrBuffLen);
#else //!UNICODE
//UTF8 转换到 Unicode
int iSrcLen = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
WCHAR *pWString = new WCHAR[iSrcLen + 1];
MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, pWString, iSrcLen);
pWString[iSrcLen] = 0;

//Unicode 转到多字节
iConvRet = WideCharToMultiByte(cpCode, 0, pWString, -1, pStrBuffer, iStrBuffLen, NULL, NULL);

//结束清理
delete [] pWString;
#endif //UNICODE

return iConvRet;
}


{
LPCTSTR szSrc = _T("防踩踏#19#res\\Media\\图片\\JPG\\防踩踏.jpg#JPG#5#1#1#0");
char chUtf8[128] = {0};
TCHAR chString[128]={0};

StringToUtf8(szSrc, chUtf8, 128);
Utf8ToString(chUtf8, chString, 128);

TRACE(_T("%s\n"), chString);
}

长空行影 2018-10-13
  • 打赏
  • 举报
回复
一共就有90分,全用了 请高手看一下这个怎么破啊 。。

16,471

社区成员

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

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

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