在std :: string中有8个字符串

回应中的讨论

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

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

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

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

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

“महसुस”是一种尼泊尔语言,它包含5个字符,将占用15个字节。 但visual studio调试器将msg大小显示为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"महसुस");

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

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


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

链接地址: http://www.djcxy.com/p/87847.html

上一篇: 8 string in std::string

下一篇: IDEA debugger to a running java process