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

Pri*_*rya 12 c++ windows unicode utf-8 stdstring

回应中的讨论

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

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

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

std::string msg = "?????";

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

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

我的问题是:

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

Rem*_*eau 15

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

std::string msg = u8"?????";
Run Code Online (Sandbox Code Playgroud)

但是,既然你不是,你可以使用转义序列,而不是依赖源文件的charset为你管理编码,这样你的代码就更容易移植(如果你不小心将它保存为非UTF8格式):

std::string msg = "\xE0\xA4\xAE\xE0\xA4\xB9\xE0\xA4\xB8\xE0\xA5\x81\xE0\xA4\xB8"; // "?????"
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

std::string msg = toUtf8(L"?????");
Run Code Online (Sandbox Code Playgroud)


Ser*_* K. 5

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