消息关闭
    暂无新消息!
 已知:asd但是法s国1 的 utf8 编码值十六进制表示 是 “617364e4bd86e698afe6b39573e59bbd31”

我写的代码存在bug,请帮忙修改,代码如下:

void CMFCApplication2Dlg::OnBnClickedButton1()
{

// TODO:  在此添加控件通知处理程序代码

std::string strInput = "617364e4bd86e698afe6b39573e59bbd31";
int nLenInput = strInput.length();

CHAR* chTest = new CHAR(nLenInput / 2);
for (int i = 0; i < nLenInput; i += 2)
{
std::string strTemp = strInput.substr(i, 2);
chTest[i/ 2] = strtol(strTemp.c_str(), NULL, 16);
}

int nlen = MultiByteToWideChar(CP_UTF8, 0, chTest, -1, NULL, 0);
WCHAR* szBuf = new WCHAR[nlen + 1];
memset(szBuf, 0, sizeof(szBuf));
int nLenNew = MultiByteToWideChar(CP_UTF8, 0, chTest, -1, szBuf, nlen);
CString strText(szBuf, nLenNew);
AfxMessageBox(strText);
delete[] szBuf;
szBuf = NULL; 
}

代码如上,请指点,谢谢。

2个回答

︿ 1
今天调试时候发现是 声明字符串指针的时候写错了,修改之后可以正常运行。
之前有问题的时候这一句:
CHAR* chUtf8 = new CHAR[nLenInput / 2 + 1];
中的中括号写成了小括号。。。。。。。
修改后的代码如下:


std::wstring HexUtf8StringToWstring(std::string str)
{
std::string strHexInput = str;
int nLenInput = strHexInput.length();

CHAR* chUtf8 = new CHAR[nLenInput / 2 + 1];
memset(chUtf8, 0, sizeof(CHAR)* (nLenInput / 2 + 1));
for (int i = 0; i < nLenInput; i += 2)
{
std::string strTemp = strHexInput.substr(i, 2);
chUtf8[i / 2] = strtol(strTemp.c_str(), NULL, 16);
}
chUtf8[nLenInput / 2] = 0;

// int nlen = strlen(chUtf8);
int nlen = ::MultiByteToWideChar(CP_UTF8, 0, chUtf8, nLenInput / 2, NULL, 0);
WCHAR* szBuf = new WCHAR[nlen + 1];
memset(szBuf, 0, sizeof(WCHAR)* (nlen + 1));
nlen = ::MultiByteToWideChar(CP_UTF8, 0, chUtf8, nLenInput / 2, szBuf, (nlen + 1) * sizeof(WCHAR));

std::wstring wstr = std::wstring(szBuf);
delete[] szBuf;
delete[] chUtf8;
szBuf = NULL;
chUtf8 = NULL;
return wstr;
}
︿ 0
std::wstring HexUtf8StringToWstring(std::wstring wstr)
{
std::wstring strHexInput = wstr;
int nLenInput = strHexInput.length();

CHAR* chUtf8 = new CHAR[nLenInput / 2 + 1];
memset(chUtf8, 0, sizeof(CHAR)* (nLenInput / 2 + 1));
for (int i = 0; i < nLenInput; i += 2)
{
std::wstring strTemp = strHexInput.substr(i, 2);
chUtf8[i / 2] = wcstol(strTemp.c_str(), NULL, 16);
}
chUtf8[nLenInput / 2] = 0;

// int nlen = strlen(chUtf8);
int nlen = ::MultiByteToWideChar(CP_UTF8, 0, chUtf8, nLenInput / 2, NULL, 0);
WCHAR* szBuf = new WCHAR[nlen + 1];
memset(szBuf, 0, sizeof(WCHAR)* (nlen + 1));
nlen = ::MultiByteToWideChar(CP_UTF8, 0, chUtf8, nLenInput / 2, szBuf, (nlen + 1) * sizeof(WCHAR));

std::wstring wstrOutPut = std::wstring(szBuf);
delete[] szBuf;
delete[] chUtf8;
szBuf = NULL;
chUtf8 = NULL;
return wstrOutPut;
}