jsoncpp 无法正确生成带汉字的Json的问题!!!高分求教!!

bandaoyu 2019-03-05 12:59:07
我在数据库存有UTF8的 汉字 ,读出来后,用jsoncpp的 writer 生成JSON,




结果并不能生成正确的JSON,现象就是汉字右边的双引号总是没有,见图:


然而诡异的是,如果监视中查看二进制数据,却有看到““”的数据,见index=94的字节:




还有就是,只要我在数据库中的字段的中文后面加一个".",就能够正常生成JSON,比如:黄铭凯,改成:黄铭凯. 这样就可以,或者汉字后面加一个字母也可以,比如:黄铭凯A

这是什么情况?该如何处理
...全文
2884 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdview 2019-03-19
  • 打赏
  • 举报
回复
5.0的不支持ANSI 最先新版的好像可以了
bandaoyu 2019-03-09
  • 打赏
  • 举报
回复
引用 27 楼 赵4老师 的回复:
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
这个机器人还挺智能,知道我们在聊什么
赵4老师 2019-03-09
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
@风轻云淡_ 2019-03-09
  • 打赏
  • 举报
回复
引用 28 楼 bandaoyu 的回复:
引用 27 楼 赵4老师 的回复:
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
这个机器人还挺智能,知道我们在聊什么
他不是机器人
@风轻云淡_ 2019-03-08
  • 打赏
  • 举报
回复
感觉我已经说足够多了,加油!在这之前,我还想让你把22楼的话后半部分的话重新读一遍。
引用 22 楼 @风轻云淡_ 的回复:
读数据库和读文件原理是一样的,唯一能影响结果的就是编码,我说的调一下ide 的编码不是说ide的编码和最后的结果有关系,而是想让你在调试过程中能看到字符串的拼接过程,这样你就能在调试过程中发现是哪个环节出了问题。

忘加结束符只是一种可能,我用要么连接的,我确定并且认真的读过你的话了,所以我更倾向于编码的问题,加上这句话只是为了保险,从而排除掉一切可能的因素。但是你认真的读完我的话了吗?还有我从没说过IDE编码和最后的结果有关系,我只是想让你通过修改IDE编码,在预览窗口看看从数据库读出来的原始数据有问题还是拼json字符串出现的问题(这是第三遍了),另外这些输出你都做了吗 确定是读数据库没问题,生成json的时候出问题了吗?
引用 4 楼 @风轻云淡_ 的回复:

这些你都做过了吗,应该没有吧 你就逮住jsoncpp一直找原因,相信我,你会得不偿失的。
bandaoyu 2019-03-08
  • 打赏
  • 举报
回复
已经解决了,谢谢大家。

问题在于 Json::Value只能处理ANSI类型的字符串,如果程序使用Unicode编码,需要加一个转码函数。

mysql数据库有unicode模式和ANSI模式,一般是前者。所以我读取出来之后,需要将 名字字符串转码成ANSI,这样就可以了。

bandaoyu 2019-03-07
  • 打赏
  • 举报
回复
引用 19 楼 starytx 的回复:

16楼给出了数据的SQL,要不你试试把我这个表导入到你的数据库,然后读出记录然后生成JSON 看看能不能正确生成。

我链接数据库的时候 链接的chartset 指定为UTF8了,表格也是UTF8
starytx 2019-03-07
  • 打赏
  • 举报
回复
只遇到过特殊中文字符解析失败的情况,比如这种字"黒",但后来还是解决掉了,好像是jsoncpp的一个bug
bandaoyu 2019-03-07
  • 打赏
  • 举报
回复
引用 22 楼 @风轻云淡_ 的回复:
1、你注意看我这段话“还有就是,只要我在数据库中的字段的中文后面加一个".",就能够正常生成JSON,比如:黄铭凯,改成:黄铭凯. 这样就可以,或者汉字后面加一个字母也可以,比如:黄铭凯A”
两个汉字的也是如此,所以肯定不是忘了加结束符引起的。

2、我的汉字不是在IDE输入的,而是从数据库来的,所以和IDE没关系,我也跟踪调试过,也把BUFF空间的内容贴了出来,里面是有“ 号的,可是最后却没有生成出来,不知为何。
@风轻云淡_ 2019-03-07
  • 打赏
  • 举报
回复
引用 12 楼 bandaoyu 的回复:

感觉不是jsoncpp 的问题,要么是你读数据的时候乱码了,要么是你的字符串拷贝或者赋值的时候结尾没有'\0'结束符,才会出现如此奇怪的问题。读数据库和读文件原理是一样的,唯一能影响结果的就是编码,我说的调一下ide 的编码不是说ide的编码和最后的结果有关系,而是想让你在调试过程中能看到字符串的拼接过程,这样你就能在调试过程中发现是哪个环节出了问题。
bandaoyu 2019-03-07
  • 打赏
  • 举报
回复
没有人知道吗
pstrunner 2019-03-07
  • 打赏
  • 举报
回复
下面的代码是解析URL的%分割的UTF-8字符,你可以修改下,支持\u分割的字符试一试:

std::string UrlDecode(const std::string& szToDecode)  
{  
	std::string result;  
	int hex = 0;  
	for (size_t i = 0; i < szToDecode.length(); ++i)  
	{  
		switch (szToDecode[i])  
		{  
		case '+':  
			result += ' ';  
			break;  
		case '%':  
			if (isxdigit(szToDecode[i + 1]) && isxdigit(szToDecode[i + 2]))  
			{
				std::string hexStr = szToDecode.substr(i + 1, 2);  
				hex = strtol(hexStr.c_str(), 0, 16);
				//字母和数字[0-9a-zA-Z]、一些特殊符号[$-_.+!*'(),] 、以及某些保留字[$&+,/:;=?@]  
				//可以不经过编码直接用于URL  
				if (!(
					//(hex >= 48 && hex <= 57) || //0-9  
					//(hex >=97 && hex <= 122) ||   //a-z  
					//(hex >=65 && hex <= 90) ||    //A-Z  
					//一些特殊符号及保留字[$-_.+!*'(),]  [$&+,/:;=?@]  
					hex == 0x21 || hex == 0x24 || hex == 0x26 || hex == 0x27 || hex == 0x28 || hex == 0x29 
					|| hex == 0x2a || hex == 0x2b|| hex == 0x2c || hex == 0x2d || hex == 0x2e || hex == 0x2f 
					|| hex == 0x3A || hex == 0x3B|| hex == 0x3D || hex == 0x3f || hex == 0x40 || hex == 0x5f 
					))  
				{  
					result += char(hex);
					i += 2;  
				}  
				else result += '%';  
			}else {  
				result += '%';  
			}  
			break;  
		default:
				result += szToDecode[i];  
			break;  
		}  
	}  
	return result;  
}
bandaoyu 2019-03-06
  • 打赏
  • 举报
回复
引用 6 楼 ruoxi520chenxi 的回复:
你用的是jsoncpp库吗 请问你是如何处理的
bandaoyu 2019-03-06
  • 打赏
  • 举报
回复
引用 2 楼 @风轻云淡_ 的回复:
我看了 是没有漏掉的 而且你看我在监视窗口直接看缓存空间都能看到“ 号。我的中文是直接从数据库取的,所以应该和IDE编码没关系。我明天源码放上来看看
bandaoyu 2019-03-06
  • 打赏
  • 举报
回复
引用 14 楼 ruoxi520chenxi 的回复:
我C++里面是可以的

"name" : "玩家088",
"ps" : "这家伙很懒,什么都没写!
",
直接代码里面写 是可以的 我说的是从 数据库中读出 UTF8的记录然后转不行。
bandaoyu 2019-03-06
  • 打赏
  • 举报
回复
# Host: 192.168.6.251  (Version 5.1.71)
# Date: 2019-03-06 16:33:18
# Generator: MySQL-Front 6.1 (Build 1.26)


#
# Structure for table "user"
#

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`Index` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` varchar(50) NOT NULL DEFAULT '0',
`user_name` varchar(20) NOT NULL DEFAULT '',
`pwd` varchar(20) NOT NULL DEFAULT '',
`login_time` varchar(20) NOT NULL DEFAULT '',
`level` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`Index`),
UNIQUE KEY `user_id` (`user_id`),
UNIQUE KEY `user_name` (`user_name`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

#
# Data for table "user"
#

/*!40000 ALTER TABLE `user` DISABLE KEYS */;
INSERT INTO `user` VALUES (1,'0','肖波纳','123','201811211912',' 1'),(2,'1','郭晶敏','123','201811212118','2'),(3,'2','胡永海','123','201811212116','3'),(4,'3','柏树生','123','201811212115','4'),(5,'4','景小甜','tttt','201811212114','1'),(6,'5','马龙乒','rrrr','201811212117','1'),(7,'6','林冲宋','yyy','201811212111','1'),(8,'7','华为贵','ppp','201811212112','9');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;


大家试试把我这个表导入到你们数据库,然后读出记录然后生成JSON 看看能不能正确生成。

我链接数据库的时候 链接的chartset 指定为UTF8了,表格也是UTF8
ruoxi520chenxi 2019-03-06
  • 打赏
  • 举报
回复
那是我解析出来的
ruoxi520chenxi 2019-03-06
  • 打赏
  • 举报
回复
我C++里面是可以的

"name" : "玩家088",
"ps" : "这家伙很懒,什么都没写!
",
@风轻云淡_ 2019-03-05
  • 打赏
  • 举报
回复
引用 1 楼 smwhotjay 的回复:
jsoncpp 确实不能直接中文encode. 正确的含中文的应该编码成 "name":"\u4e2d\u6587\u540d"}

可以看这个帖子

https://bbs.csdn.net/topics/391894820

你是说这样验证吗,还是怎么验证?


要不你吧你用的验证链接发我一下,这个我是真不知道JSON格式有中文验证还通不过?
smwhotjay 2019-03-05
  • 打赏
  • 举报
回复
引用 8 楼 @风轻云淡_ 的回复:
[quote=引用 7 楼 smwhotjay 的回复:]
[quote=引用 3 楼 @风轻云淡_ 的回复:]
[quote=引用 1 楼 smwhotjay 的回复:]
jsoncpp 确实不能直接中文encode. 正确的含中文的应该编码成 "name":"\u4e2d\u6587\u540d"}

可以看这个帖子

https://bbs.csdn.net/topics/391894820

如果它不能直接组中文,那它早就被淘汰了。。[/quote]
如果是c++ 那么是可以这么用,直接中文,但那种并不是正规json格式。属于不标准,中文要转码utf8 成这种\u4e2d\u6587\u540d[/quote]
你说的是通信传输的时候吧。在C/C++里,这就是正规的json格式,而且jsoncpp就是专门为C/C++设计的,生产环境这样用也没有问题。你说的转码应该是在网络通信的时候,因为无法判断接收端使用的字符集,就将中文转换为unicode国际通用编码,防止无法解码而乱码,而不是说这种不是正规的json格式。[/quote]
把你生成的json字符串在网上json验证下就知道是不是合法json了
加载更多回复(9)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧