一、jsoncpp中文写入为\u****问题处理;jsoncpp中文乱码解决;
当我们使用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读取;
二、源码方式使用jsoncpp;
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了;
三、UTF_8和ASSIC相互转换;
#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;
}