Json 타입은 많은 곳에서 데이터 송&수신 및 저장 용으로 사용하고 있습니다. 현재 관리중인 제품에서도 여러 용도로 사용하고 있고 앞으로도 여러 곳에서 사용 예정입니다.
Cpp 언어에서 json을 사용하기 위해 jsoncpp 라이브러리 submodule을 이용하여 오랫동안 사용하고 있다가 nuget 화를 시키면서 이슈가 발생하여 분석을 진행하였습니다.
UTF-8
으로 저장jsoncpp 1.9.4
업그레이드Unicode Escape
으로 저장 확인jsoncpp 1.8.4 버전 이후로 기본 인코딩 방식이 UTF-8
에서 Unicode Escape
방식으로 변환되어 발생한 이슈
jsoncpp 1.8.3
이전 버전
UTF-8 encoding
{
"test": "123안녕하세요 json encoding 테스트입니다."
}
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"
}
*/