제 JsonCpp은 BOM과 텍스트의 UTF-8 인코딩을 읽어

지식의 해석
             UTF-8 파일을 열려면 Windows 메모장에 의해 인코딩에서는 EF BB BF가, 쇼 텍스트 인코딩이 UTF-8 인 3 바이트의 시작 부분에 더 많은 파일을 추가, 시간을 절약 할 기본은,이 기술이 호출됩니다 BOM (바이트 순서 마크, 바이트 순서 마크이다). 이는 UNIX 또는 Linux 운영 체제에서 발생하지 않습니다. 텍스트가 ANSI 형식으로 인코딩 된 경우 나 다른 문자를 추가 할 수 있습니다.


텍스트 읽어 차이
는 BOM 텍스트 바이트 스트림
"쌰 Nuo의 \ 연구 \ n {\ 연구 \ n 개의 \ t의 \"버전 \ "\"1.0.0 \ ", \ 연구 \ n \ t \"은 messageType \ "\"알람 \ " , \ 연구 \ n \ t \"cmdtype \ ": 10009, \ 연구 \ n \ t \"SN \ "\"202039248932482934 \ "

不带BOM的文本字节流
"[\ R \ 없음 {\ r에 \ n의 \ t의 \"버전 \ 1.0.0 \ "\", "\ R \ n \ t \"은 messageType \ "\"알람 \ "\ \ r \ n를 t \"cmdtype \ "10009 \ R \ n \ t \"SN \ "\"202,039,248,932,482,934 \ "


문제
 경우의 BOM과 텍스트 바이트 스트림을 통과은 JsonCpp 기본을 해결하기 위해, 구문 분석은 확실히 밖으로 때문에 개 이상의 바이트 EF BB BF, 그들은 텍스트에서 제거 이들 3 바이트가 필요하므로


代码
 표준 : : ifstream의 IFS;
 ifs.open (pFileName, 표준 : : ifstream ::의 | 표준 : : ifstream :: 바이너리);

 표준 : 문자열 STR ((표준 : istreambuf_iterator <문자> (IFS)) 표준 : istreambuf_iterator <문자> ());
 표준 : : 문자열 strValidJson;
 경우 ((은 0xEF == (서명 숯불) STR [0]) && (0xbb 경계 == (서명 숯불) STR [1]) && (하여 0xbf == (서명 숯불) STR [2]))
 {
  strValidJson = str.substr (3 str.length () - (3));
 }
 다른
 {
  strValidJson = STR;
 }
 //开始解析JSON文本
 JSON :: 리더 리더;
 JSON :: 값 루트;
 (NULL == reader.parse (strJson, 루트)) 반환하는 경우;


추천

출처blog.51cto.com/fengyuzaitu/2412115