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<char>(ifs)), std::istreambuf_iterator<char>());
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)) return;
- php怎么解析utf-8带BOM编码的json数据,php解析json数据返回NULL
- Utf-8+Bom编码导致的读取数据部分异常问题
- 读取文本出现 锘 * 系列乱码错误(UTF-8 BOM问题)的原因及解决方法
- 读取utf-8等编码的文本
- BOM与读取UTF-8编码格式文件首行乱码问题
- 将电脑新建文本文档txt的默认编码从ANSI改为utf-8
- 解决CodeSmith代码模版输出文件的编码格式为有bom的UTF-8的问题
- notepad++新建文件时如何设置默认编码为utf_8(无包含BOM)
- PHP json_decode的坑 仅仅支持utf-8编码的字符,gbk编码会返回null
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
- UTF-8的BOM头导致 new JSONObject(JSonStr)出错
- 当JSP文件和JS文件编码不一致的问题,以及UTF-8的BOM问题
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- JAVA从UTF-8编码文件读取字符串时,前边有问号的问题
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
- [Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题
- 批量转txt文本编码,由utf-8转为ANSI(ASCII)
- J2ME读取UTF-8编码文件方法
- 文件编码及UTF-8、BOM、0XFEFF相关问题
- 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词