ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-10-14 19:03:58  阅读:263  来源: 互联网

标签:中文 CP pW int jsoncpp 乱码 json NULL


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

 

标签:中文,CP,pW,int,jsoncpp,乱码,json,NULL
来源: https://blog.csdn.net/qq_36626674/article/details/120760941

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有