热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

jsoncpp写文件中文乱码问题解决

不进行streamWritebuilder的设置,写入的中文会变成unicode形式,如下图并且转中文不是之前写入的内容,这里使用的是新版的jsonWrite#include

不进行streamWritebuilder的设置,写入的中文会变成unicode形式,如下图

并且转中文不是之前写入的内容,

这里使用的是新版的jsonWrite

#include
#include
#include
#include
void StreamWrite()
{
Json::Value root;
root["Name"] = "王";
root["Age"] = 20;
//关键在于对builder的属性设置
Json::StreamWriterBuilder builder;
static Json::Value def = []() {
Json::Value def;
Json::StreamWriterBuilder::setDefaults(&def);
def["emitUTF8"] = true;
return def;
}();
builder.settings_ = def;//Config emitUTF8
const std::unique_ptr writer(builder.newStreamWriter());
std::fstream fs;
fs.open("save.json", std::ios::out);
writer->write(root, &std::cout);
writer->write(root, &fs);
}
int main()
{
StreamWrite();
return 0;
}

 

趟坑经历:

我把本地字节ANSI转成UNICODE(UTF-16) 然后再转成UTF-8,进行jsoncpp的写入,得到的结果是UNICODE的\uxxxx表达。

#include
#include
std::wstring ANSI2WChar(const std::string& strData)
{
//把GB2312编码的中文字串转换为UTF-8编码的中文字串  
int iLen = strData.length();
CHAR* pMb = new CHAR[iLen + 1];
int iMbLen = iLen + 1;
ZeroMemory(pMb, iMbLen);
memcpy_s(pMb, iMbLen, strData.c_str(), strData.length());
//将多字节字符串编码转换成宽字符串  
iLen = ::MultiByteToWideChar(CP_ACP, 0, pMb, iMbLen, NULL, 0);
WCHAR* lpszW = NULL;
lpszW = new WCHAR[iLen];
::wmemset(lpszW, 0, iLen);
int iRtn = ::MultiByteToWideChar(CP_ACP, 0, pMb, iMbLen, lpszW, iLen);
std::wstring wstr(L"");
if (iRtn == iLen)
{
wstr = lpszW;
}
delete[] lpszW;
delete[] pMb;
lpszW = nullptr;
pMb = nullptr;
return wstr;
}
int main() {
std::wstring_convert, wchar_t> convert;
std::string utf8_string = convert.to_bytes(L"中文");
//jsonwrite部分
}

 



推荐阅读
author-avatar
小何775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有