mysql锘縖_JsonCpp第五课 读取带BOM的UTF-8编码文本

知识解读

在Windows通过记事本打开的UTF-8编码文件,默认会在保存的时候,往文件开头多添加三个字节EF BB BF,表明文本的编码方式是UTF-8,这种技术就叫做BOM(Byte Order Mark,就是字节序标记)。在Unix或者Linux操作系统中不会出现这种情况。如果该文本是ANSI格式编码的,也没有添加其他的字符。

文本内容读取差异

带有BOM的文本字节流

"锘縖\r\n{\r\n\t\"version\": \"1.0.0\",\r\n\t\"messagetype\": \"alarm\",\r\n\t\"cmdtype\": 10009,\r\n\t\"sn\":\"202039248932482934\"

不带BOM的文本字节流

"[\r\n{\r\n\t\"version\": \"1.0.0\",\r\n\t\"messagetype\": \"alarm\",\r\n\t\"cmdtype\": 10009,\r\n\t\"sn\": \"202039248932482934\"

问题

默认情况下传递带有BOM的文本字节流给JsonCpp解析,肯定是解析不出来的,因为多了EF BB BF三个字节,所以需要将这三个字节从文本中剔除

代码

std::ifstream ifs;

ifs.open(pFileName, std::ifstream::in | std::ifstream::binary);

std::string str((std::istreambuf_iterator(ifs)), std::istreambuf_iterator());

std::string strValidJson;

if ((0xef == (unsigned char)str[0]) && (0xbb == (unsigned char)str[1]) && (0xbf == (unsigned char)str[2]))

{

strValidJson = str.substr(3, str.length() - 3);

}

else

{

strValidJson = str;

}

//开始解析Json文本

Json::Reader reader;

Json::Value root;

if (NULL == reader.parse(strJson, root))

{

ifstream.close();

return;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值