You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:01:20