Форсировать исключение read_json, если в файле json есть какой-то китайский символ gbk

Есть такой json-файл без bom, используйте набор кодов gbk. Boost::property_tree может успешно его проанализировать в большинстве.

try {
    boost::property_tree::read_json(filename, tree);
}
catch (exception &e) {
    cerr << e.what() << endl;
}

Однако, если файл имеет китайский символ "历"(c0fa) или "繞"(c040), свойство_терева выдаст исключение "недопустимая последовательность кода"

1 ответ

Вы могли бы попытаться использовать перегрузку, которая принимает поток и напечатать правильный язык перед рукой:

#include <fstream>
#include <iostream>
#include <boost/locale.hpp>

Где вы используете Boost Locale для генерации локали, например, в POSIX:

boost::locale::generator gen;
auto CN = gen.generate("zh_CN.GBK");

И тогда наполните это:

std::ifstream ifs(filename, std::ios::binary);
ifs.imbue(CN);

boost::property_tree::ptree pt;
read_json(ifs, pt); 
Другие вопросы по тегам