如何在Poco::JSON::Object中存储Unicode字符?set方法仅支持std::string解惑
在Poco::JSON::Object中使用Unicode(含中文)作为键的解决方案
Poco的JSON实现严格遵循JSON规范,要求所有字符串(包括键)必须是UTF-8编码,因此Poco::JSON::Object::set()只接受std::string类型的键是合理设计——你不需要依赖std::wstring,只需将Unicode字符转换为UTF-8编码的std::string即可正常使用。
具体解决方法
宽字符串转UTF-8编码的std::string
如果你手里的键是std::wstring类型(比如从Windows API获取的宽字符数据),可以直接用Poco内置的Poco::UnicodeConverter工具完成转换,无需额外引入第三方库。直接使用UTF-8编码的std::string
如果你是在代码中直接编写中文字符,只要确保源文件编码为UTF-8,且编译器正确处理UTF-8输入,直接用std::string定义键即可。
官方文档说明(翻译)
Poco::JSON::Object的set方法接受const std::string& key作为键参数。JSON规范明确要求所有字符串(包括对象键)必须采用UTF-8编码,Poco的JSON实现严格遵守这一规则。因此,使用UTF-8编码的std::string就能正确存储Unicode字符(包括中文字符),无需使用std::wstring。
示例代码
#include <Poco/JSON/Object.h> #include <Poco/UnicodeConverter.h> #include <iostream> int main() { Poco::JSON::Object jsonObj; // 将宽字符串转换为UTF-8编码的std::string std::wstring wKey = L"用户姓名"; std::string utf8Key; Poco::UnicodeConverter::toUTF8(wKey, utf8Key); jsonObj.set(utf8Key, "张三"); // 直接使用UTF-8编码的字符串作为键 jsonObj.set("年龄", 25); jsonObj.set("联系地址", "北京市朝阳区"); // 格式化输出JSON验证结果 jsonObj.stringify(std::cout, 2); return 0; }
注意事项
- 编译时需确保编译器支持UTF-8源文件:GCC/Clang可添加参数
-finput-charset=UTF-8;Visual Studio需将项目"字符集"设置为"使用多字节字符集",或直接指定源文件编码为UTF-8。 - 从外部读取的非UTF-8编码字符串(比如GBK格式),需要先转换为UTF-8再传入
set()方法,避免出现乱码。
内容的提问来源于stack exchange,提问作者François Colas
相关产品推荐
相关产品推荐

