如何正确存储中文字符串?

How to store the Chinese strings correctly?

提问人:keen 提问时间:7/9/2023 最后编辑:Kesto2keen 更新时间:7/9/2023 访问量:84

问:

在 Visual Studio 2022 中,使用 [标记:C++ 17]。我正在尝试使用 a 来存储中文字符串:std::map

std::map<std::string, std::string> translation;
translation["Type"] = "类型";

插入值后,翻译中的字符串为问号 (??)

我尝试使用:

#pragma execution_character_set("utf-8")

然后翻译中的字符串成为一些垃圾值。

如何正确存储中文字符串?请帮忙。

C++ UTF-8 C++17 stdstring 中文语言环境

评论

0赞 Kesto2 7/9/2023
插入后,您如何检查字符串内的值?
1赞 keen 7/9/2023
我放置了一个断点,并查看“translation”中的数据
0赞 Giacomo Catenazzi 7/10/2023
注意:控制台和终端可能对编码有不同的看法。如果你的源代码是 UTF-8,那么代码应该可以很好地工作。如果要调试,请先写入文件(以减少更棘手的编码问题)。当您在文件上有正确的输出时,您可以开始检查如何设置控制台以理解 UTF-8(如果您对 cout 使用此类编码。

答:

2赞 Serge Ballesta 7/9/2023 #1

编译指示不是你想要的。它只是要求编译器在可执行文件中以 utf-8 格式对字符串进行编码。但是,在可执行文件中对其进行编码之前,字符串必须存在于源文件中。在屏幕上显示它不是问题,因为 Windows 原生使用 16 位字符,它可以轻松显示汉字。

但是源文件编码通常只是简单的 8 位字符编码。在我的法语系统中,它默认使用 1252 代码页,这是 ISO-8859-1 字符集的细微变化。并且无法在此编码中对中文字符进行编码,因此 VisualStudio 在 c++ 文件级别用问号替换有问题的字符。

因此,唯一可靠的方法是要求 VisualStudio 在保存文件时使用不同的编码。通常,它应该在第一次保存文件时询问您,但您可以强制它使用不同的编码重写文件 文件/另存为。然后,可以将“保存”按钮切换为 。 现在,您可以使用本机 UTF16 little-endian (1200) 或 utf-8 (65001) 将中文字符成功写入源文件。然后,您将在可执行文件中获得正确的 utf8 编码。Save with encoding...

但是,为了能够在运行时显示它们,您当然必须使用 GUI 应用程序(本机启用 unicode)或在 Windows 控制台中为控制台应用程序安装可接受的代码页......