jsoncpp中文写入为\u****问题处理;jsoncpp中文乱码解决;源码方式使用jsoncpp;UTF_8和ASSIC相互转换;

一、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、如下图将原来的代码注释掉,换成新的那一行代码;

jsoncpp中文写入为\u****问题处理;jsoncpp中文乱码解决;源码方式使用jsoncpp;UTF_8和ASSIC相互转换;

         到这里,恭喜你哈哈中文不再是乱码的或者显示/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文件夹,里面就是你需要的源码;

jsoncpp中文写入为\u****问题处理;jsoncpp中文乱码解决;源码方式使用jsoncpp;UTF_8和ASSIC相互转换;

 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;
}

 

上一篇:jsoncpp


下一篇:jsoncpp的使用简介