解析带有\\u****的json一些事和string未知问题

关于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调试的时候,当字符串过长就不展示内容,其实字符串能正常保存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值