将unicode UTF-8字符串存储在std::string中

Storing unicode UTF-8 string in std::string

本文关键字:std string 存储 unicode UTF-8 字符串      更新时间:2023-10-16

回应中的讨论

C++中的跨平台字符串(和Unicode)

如何以跨平台友好的方式处理C/C++中的Unicode字符串?

我正在尝试将UTF-8字符串分配给Visual Studio 2010环境中的std::string变量

std::string msg = "महसुस";

但是,当我查看字符串视图调试器时,我只看到"????"我已将文件保存为Unicode(带签名的UTF-8)我正在使用字符集"使用unicode字符集"

"महसुस"是尼泊尔语,它包含5个字符,将占用15个字节。但visual studio调试器显示消息大小为5

我的问题是:

如何使用std::string只存储utf-8而不需要操作它

如果您使用C++11,那么这将很容易:

std::string msg = u8"महसुस";

但由于你不是,你可以使用转义序列,而不依赖于源文件的字符集来为你管理编码,这样你的代码就更容易移植(以防你意外地将其保存为非UTF8格式):

std::string msg = "xE0xA4xAExE0xA4xB9xE0xA4xB8xE0xA5x81xE0xA4xB8"; // "महसुस"

否则,您可能会考虑在运行时进行转换:

std::string toUtf8(const std::wstring &str)
{
    std::string ret;
    int len = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0, NULL, NULL);
    if (len > 0)
    {
        ret.resize(len);
        WideCharToMultiByte(CP_UTF8, 0, str.c_str(), str.length(), &ret[0], len, NULL, NULL);
    }
    return ret;
}

std::string msg = toUtf8(L"महसुस");

您可以在Watches窗口中编写msg.c_str(), s8以正确查看UTF-8字符串。

如果您有C++11,您可以编写u8"महसुस"。否则,您将不得不编写实际的字节序列,对UTF-8序列中的每个字节使用xxx

通常,您最好从配置文件中读取这样的文本。

由于's8'格式说明符,有一种方法可以显示正确的值。如果我们将",s8"附加到变量名,Visual Studio将以UTF-8重新分析文本并正确呈现文本:

如果您使用的是Microsoft Visual Studio 2008 Service Pack 1,则需要应用修补程序

http://support.microsoft.com/kb/980263