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

在VS2022(C++17)中如何正确存储中文字符串?

解决Visual Studio 2022中C++17存储中文字符串到std::map的乱码/问号问题

问题根源

出现问号或乱码的核心原因是源文件编码、编译时字符集、运行时字符集三者不统一,导致中文字符在存储或解析过程中被错误转译。

解决方案

方案一:继续使用std::string,统一UTF-8编码

  1. 设置源文件编码为UTF-8 with BOM
    打开目标cpp文件,点击VS顶部菜单栏「文件」→「高级保存选项」,在「编码」下拉列表选择「Unicode (UTF-8 带签名) - 代码页 65001」,保存文件。

  2. 配置项目字符集为UTF-8
    右键项目→「属性」→「配置属性」→「C/C++」→「所有选项」,找到「源字符集」和「执行字符集」,均设置为「UTF-8」;也可在「常规」选项卡中将「字符集」设为「使用多字节字符集」(需确保源文件已转UTF-8 with BOM)。

  3. 修复控制台输出乱码(如果需要)
    若要在控制台正确打印中文字符,在main函数开头添加以下代码:

    #include <windows.h>
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);
    

方案二:使用宽字符类型std::wstring(更推荐)

直接改用Unicode宽字符容器,从根源避免编码转换问题:

#include <map>
#include <string>

int main() {
    std::map<std::wstring, std::wstring> translation;
    translation[L"Type"] = L"类型";
    // 后续操作保持宽字符逻辑即可
    return 0;
}

然后在项目属性中,将「配置属性」→「常规」→「字符集」设为「使用Unicode字符集」,同时确保源文件编码为UTF-8 with BOM。

为什么之前的尝试失败?

  • 未设置源文件编码时,VS默认用GBK编码存储文件,"类型"被保存为GBK字节;程序运行时若用UTF-8解析这些字节,就会出现问号。
  • 添加#pragma execution_character_set("utf-8")后,若源文件仍为GBK编码,GBK字节被强制当作UTF-8解析,自然产生乱码。

内容的提问来源于stack exchange,提问作者keen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:22:44