Jsoncpp 업데이트 시 인코딩 이슈

Jooss·2023년 10월 20일
0

cpp

목록 보기
6/7
post-custom-banner

Json 타입은 많은 곳에서 데이터 송&수신 및 저장 용으로 사용하고 있습니다. 현재 관리중인 제품에서도 여러 용도로 사용하고 있고 앞으로도 여러 곳에서 사용 예정입니다.

Cpp 언어에서 json을 사용하기 위해 jsoncpp 라이브러리 submodule을 이용하여 오랫동안 사용하고 있다가 nuget 화를 시키면서 이슈가 발생하여 분석을 진행하였습니다.

이슈 확인 상황

  1. jsoncpp를 통해 txt 파일 저장 시 UTF-8 으로 저장
  2. nuget 패키지 적용 후 jsoncpp 1.9.4 업그레이드
  3. jsoncpp를 통해 txt 파일 저장 시 Unicode Escape으로 저장 확인

이슈 발생 원인

jsoncpp 1.8.4 버전 이후로 기본 인코딩 방식이 UTF-8 에서 Unicode Escape 방식으로 변환되어 발생한 이슈

  1. jsoncpp 1.8.3 이전 버전

    • UTF-8 encoding
    {
    	"test": "123안녕하세요 json encoding 테스트입니다."
    }
  2. jsoncpp 1.8.4

    • UTF-8 string with Unicode escapes #687
    {
    	"test": "123\uC548\uB155\uD558\uC138\uC694\u0020\u006A\u0073\u006F\u006E\u0020\u0065\u006E\u0063\u006F\u0064\u0069\u006E\u0067\u0020\uD14C\uC2A4\uD2B8\uC785\uB2C8\uB2E4\u002E"
    }

해결 방법

jsoncpp 1.9.2 이후 버전에서 제공 #1045

#include <json/json.h>
#include <iostream>

void print_json(const Json::Value& value, bool emitUTF8) {
    Json::StreamWriterBuilder builder;
    builder.settings_["emitUTF8"] = emitUTF8;
    std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
    writer->write(value, &std::cout);
}

int main() {
    Json::Value root;
    root["test"] = "123안녕하세요 json encoding 테스트입니다.";

    print_json(root, true);  //UTF-8
    std::cout << std::endl;
    print_json(root, false); //Unicode-Escape
}

/*
output:
{
    "test" : "123안녕하세요 json encoding 테스트입니다."
}
{
    "test" : "123\uC548\uB155\uD558\uC138\uC694\u0020\u006A\u0073\u006F\u006E\u0020\u0065\u006E\u0063\u006F\u0064\u0069\u006E\u0067\u0020\uD14C\uC2A4\uD2B8\uC785\uB2C8\uB2E4\u002E"
}
*/

Reference

profile
개발자 세상을 여행중인 히치하이커입니다.
post-custom-banner

0개의 댓글