关于utf-8和Unicode中文中带有\u转中文的坑
因为这次接口范围的字符串信息不同于以往
像这样esoultJson = “{“success”: true, “msg”: “\u6570\u636e\u83b7\u53d6\u6210\u529f!”, “oplist”: [{”\u626b\u63cf\u65f6\u95f4": “2020-12-07 14:23:12”, “\u5165\u5e93\u65f6\u95f4”: “2020-12-07 14:23:33”, "\u626b\u63cf\u7c7b\…
,如果用普通的
// A code block
char* CWininetHttp::UtfToGbk(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if (wstr) delete[] wstr;
return str;
}
就无法顺利的转换成中文字符,后面我想到直接用替换,,把\u替换成\u这样也行不通,因为字符\u无法单独处理,还是放弃了这个方法,
再后来我有想这把后面的字符直接替换成字符传然后不带上\u,
std:: string ToChinese(std::string str)
{
if (str == "")
return "";
std::string strText;
char ls[4] = { 0 };
char* a;
WCHAR c;
std::wstring s;
char* cstr = new char[str.length() + 1];
memset(cstr, 0, str.length() + 1);
std:; strcpy(cstr, str.c_str());
for (char * p = cstr; *p != '\0'; p++)
{
if (*p == '\\')
{
if (*(p + 1) == _T('u'))
{
a = p + 2;
strncpy(ls, a, 4);
c = strtol(ls, NULL, 16);
s = c;
strText.append(UnicodeToANSI(s));
p += 5;
continue;
}
}
strText += *p;
}
delete[] cstr;
cstr = NULL;
return strText;
}
后来又出现了一个问题 string在接收超过一定字符后就会变成无法识别的字符串,这又让我困扰了。
朋友说这时时uft-16也就是Unicode编码,我也就在网上找了一些方法,
后来发现用push_back就不会出现string超过内容就无法获取问题
借鉴了别人的方法,这里谢谢知道大神edisonrush
std::wstring unicode2string(const char* str) {
std::wstring rst;
bool escape = false;
int len = strlen(str);
int intHex;
char tmp[5];
memset(tmp, 0, 5);
for (int i = 0; i < len; i++)
{
char c = str[i];
switch (c)
{
case'\\':
escape = true;
break;
case'%':
case'u':
case'U':
if (escape)
{
memcpy(tmp, str + i + 1, 4);
sscanf(tmp, "%x", &intHex); //把bai16进制du字zhi符转dao换zhuan为shu数字
rst.push_back(intHex);
i += 4;
escape = false;
}
else {
rst.push_back(c);
}
break;
default:
rst.push_back(c);
break;
}
}
return rst;
}
总算解决了这个问题,
还有一个问题string的,string在用 +和append()的时候当字符数大于200的时候就会出现字符串无法读取,后来发现这个是因为vs调试的时候,当字符串过长就不展示内容,其实字符串能正常保存。