当我们使用jsoncpp读取写入json文件时,会发现明明是中文字符串,但是赋值给Json::Value后却变成\u****这样的了,而且读取出来还是乱码的。
我经历了各种转码,发现难受啊,根本不行,或者部分汉字对的,部分不正确,翻遍了整个百度,有修改
最终通过调试源码发现,中文被转码了,暂时没看明白这样做为什么;所以采用如下处理即可解决:(首先说明我将jsoncpp库弄成了源代码方式使用,即只有jsoncpp.cpp、jsoncpp.h两个文件了,后面将说如何操作)
1、找到jsoncpp.cpp里面的valueToQuotedStringN函数,找到最后switch的default;
static String valueToQuotedStringN(const char* value, unsigned length, bool emitUTF8 = false)
2、如下图将原来的代码注释掉,换成新的那一行代码;
到这里,恭喜你哈哈中文不再是乱码的或者显示/u****了;并且不管你是VS下默认的ASSIC编码方式还是QT的UTF_8编码方式,写入文件,读取文件都是原封不动显示中文内容了,不过ASSIC写入的,就以ASSIC读取;UTF_8写入的就以UTF_8读取;
1、官网下载jsoncpp,下载地址:https://github.com/open-source-parsers/jsoncpp;
2、下载并安装python环境,官网或者百度下载都可以,官网地址:Download Python | Python.org;
3、如图所示,解压下载的jsoncpp源码,amalgamate.py便是生成可直接使用的json源码文件的脚本,在jsoncpp-master目录按住shift后鼠标右键运行cmd,执行python amalgamate.py便可得到如图所示dist文件夹,里面就是你需要的源码;
4、进入dist文件夹,你会看到jsoncpp.cpp文件和json文件夹;进入json文件夹,只需要json.h文件,根据我对比发现另一个文件内容其实在json.h里面包含了的,所以不需要;最好把jsoncpp.cpp和json.h文件放在一起,把json.h改名为jsoncpp.h并把jsoncpp.cpp里面原来的#include "json/json.h"改为#include "jsoncpp.h",以后就是用这两个文件,已源码方式使用jsoncpp了;
#include <windows.h> //ASCII转UTF_8 string ASCII_To_Utf_8(string AsciiStr) { int nStrLen = AsciiStr.size(); string Utf8Str; if (nStrLen > 0) { int nRet(0); int nUtf16Len = MultiByteToWideChar(CP_ACP, 0, AsciiStr.c_str(), nStrLen, NULL, 0); if (nUtf16Len > 0) { wchar_t* pW = new wchar_t[nUtf16Len]; if (pW != nullptr) { int nUtf8Ret = WideCharToMultiByte(CP_UTF8, 0, pW, nUtf16Len, NULL, 0, NULL, NULL); char* pUtf8Buffer = new char[nUtf8Ret + 1]; if (pW != nullptr) { nUtf16Len = MultiByteToWideChar(CP_ACP, 0, AsciiStr.c_str(), nStrLen, pW, nUtf16Len); nRet = WideCharToMultiByte(CP_UTF8, 0, pW, nUtf16Len, pUtf8Buffer, nUtf8Ret, NULL, NULL); pUtf8Buffer[nUtf8Ret] = '\0'; Utf8Str.append(pUtf8Buffer, nUtf8Ret + 1); delete[]pUtf8Buffer; pUtf8Buffer = nullptr; } delete[]pW; pW = nullptr; } } } return Utf8Str; } //UTF_8转ASCII std::string UTF_8_To_ASCII(std::string& strUtf_8) { std::string strRet(""); int widesize = ::MultiByteToWideChar(CP_UTF8, 0, strUtf_8.c_str(), -1, NULL, 0); if (widesize > 0) { wchar_t* wBuff = new wchar_t[widesize]; int convresult = ::MultiByteToWideChar(CP_UTF8, 0, strUtf_8.c_str(), -1, wBuff, widesize); int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wBuff, -1, NULL, 0, NULL, NULL); if (asciisize > 0) { char* cBuff = new char[asciisize + 1]; int convresult = ::WideCharToMultiByte(CP_OEMCP, 0, wBuff, -1, cBuff, asciisize, NULL, NULL); cBuff[asciisize] = '/0'; strRet.append(cBuff, asciisize + 1); delete[] cBuff; } delete[] wBuff; } return strRet; }