UTF-8转到JSON的问题

本文介绍了一个在C++中将UTF-8编码的中文字符串转换为JSON格式Unicode编码的问题及解决方案。通过自定义函数逐字符解析UTF-8编码,并将其转换成Unicode编码形式,再进一步转化为符合JSON标准的转义序列。此外还提供了一个用于替换多余转义序列的方法。

我今天碰到一个问题,就是使用的C++代码发送json数据的时候,有中文的UTF-8编码.使用 boost::property_tree::ptree发送数据的时候,我输入的是

 boost::property_tree::ptree root;
 root.put<std::string>("location","四川成都");
 std::stringstream stream;
 boost::property_tree::write_json(stream,root,false);
 std::string josnString = stream.str();

其中发送的时候我发现,里面的内容不是unicode值,面是UTF-8的内存值.为了解决这个问题花了我大半天的时间,还没有解决.最后是超哥给我一段代码解决的.回过头来理解,其实是我没有真正认真的思考这个问题.相当然的写了,最终是错的.解决的办法如下:

void ChangeToUnicode (const std::string& utf8, std::vector< unsigned int >& unicode)
{
    for (std::size_t i = 0, size = utf8.size(); i < size;)
    {
        unsigned long uni;
        int bytes = 0;
        bool error = false;
        unsigned char ch = utf8[i++];
        if (ch <= 0x7F)
        {
            uni = ch;
            bytes = 1;
        }
        else if (ch <= 0xBF)
        {
            return ;
        }
        else if (ch <= 0xDF)
        {
            uni = ch & 0x1F;
            bytes = 2;
        }
        else if (ch <= 0xEF)
        {
            uni = ch & 0x0F;
            bytes = 3;
        }
        else if (ch <= 0xF7)
        {
            uni = ch & 0x07;
            bytes = 4;
        }
        else
        {
            return ;
        }

        for (int j = 1; j < bytes; ++j)
        {
            if (i == size)
                return ;
            unsigned char ch = utf8[i++];
            if (ch < 0x80 || ch > 0xBF)
                return ;
            uni <<= 6;
            uni += ch & 0x3F;
        }

        if (uni >= 0xD800 && uni <= 0xDFFF)
            return ;
        if (uni > 0x10FFFF)
            return ;
        unicode.push_back(uni);
    }
}


std::string Utf8ToAscii(const std::string& utf8) 
{
    std::vector<unsigned int> unicode;
    ChangeToUnicode(utf8, unicode);

    std::stringstream ss;
    ss << std::hex;
    for (auto code : unicode) {
        ss << "\\u" << code;
    }
    return ss.str();
}

还有一个问题就是生成的json中,有这个"\\u",而应该是"\u"就对了.为了解决这个问题,需要自己写函数遍历字符串,替换所有出现的值.代码如下:

std::string& KDClient::replace_all_distinct(std::string&   str,const std::string&   old_value,const std::string&   new_value)   
{   
    for(std::string::size_type   pos(0);   pos!=std::string::npos;   pos+=new_value.length())   
    {   
        if(   (pos=str.find(old_value,pos))!=std::string::npos   )   
            str.replace(pos,old_value.length(),new_value);   
        else   break;   
    }   
    return   str;   
}   
replace_all_distinct(josnString,"\\\\","\\");
 基本思路是这样,明天搞另一个项目.最近过的心烦,事儿真多,年纪大了,就是不开心的事就多了.




要将Base64编码的UTF - 8格式JSON字符串换为JSON明文,可按以下步骤操作:首先对Base64编码的字符串进行解码,然后将解码后的字节数组按照UTF - 8编码换为字符串,最后将该字符串解析为JSON对象。 以下是Java和Python的示例代码: ### Java示例 Java 8及以后版本可以使用标准库中的`java.util.Base64`进行Base64解码,再结合`com.alibaba.fastjson`库(需添加依赖)将字符串解析为JSON对象。 ```java import java.util.Base64; import com.alibaba.fastjson.JSONObject; public class Base64ToJson { public static void main(String[] args) { // 示例Base64编码的UTF-8格式JSON字符串 String base64EncodedJson = "eyJ0ZXN0Ijoi5Lit5paH5a2XIn0="; // Base64解码 byte[] decodedBytes = Base64.getDecoder().decode(base64EncodedJson); // 将解码后的字节数组换为UTF-8字符串 String jsonString = new String(decodedBytes, java.nio.charset.StandardCharsets.UTF_8); // 解析JSON字符串为JSON对象 JSONObject jsonObject = JSONObject.parseObject(jsonString); System.out.println(jsonObject); } } ``` ### Python示例 Python可以使用`base64`模块进行Base64解码,使用`json`模块将字符串解析为JSON对象。 ```python import base64 import json # 示例Base64编码的UTF-8格式JSON字符串 base64_encoded_json = "eyJ0ZXN0Ijoi5Lit5paH5a2XIn0=" # Base64解码 decoded_bytes = base64.b64decode(base64_encoded_json) # 将解码后的字节数组换为UTF-8字符串 json_string = decoded_bytes.decode('utf-8') # 解析JSON字符串为JSON对象 json_object = json.loads(json_string) print(json_object) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值