utf8 字符串的十六进制编码值怎么转化成Cstring字符串

张亚成 2017-07-30 01:55:01
已知: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;
}

代码如上,请指点,谢谢。
...全文
167 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
战在春秋 2017-07-31
  • 打赏
  • 举报
回复
引用
代码如下
恭喜楼主问题得到解决。
CHAR* chTest = new CHAR(nLenInput / 2); //写成小括号,chTest定义为指向字符的指针,而不是指向数组。
确实是一个比较隐蔽的错误。
张亚成 2017-07-30
  • 打赏
  • 举报
回复
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; }
张亚成 2017-07-30
  • 打赏
  • 举报
回复
今天调试时候发现是 声明字符串指针的时候写错了,修改之后可以正常运行。 之前有问题的时候这一句: 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; }

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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