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

时间:2014-04-24 09:22:01

标签: c++ windows unicode utf-8 stdstring

回应

中的讨论

Cross-platform strings (and Unicode) in C++

How to deal with Unicode strings in C/C++ in a cross-platform friendly way?

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

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

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

“महसुस”是一种尼泊尔语言,它包含5个字符,占用15个字节。但Visual Studio调试器显示msg大小为5

我的问题是:

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

5 个答案:

答案 0 :(得分:12)

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

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

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

std::string msg = "\xE0\xA4\xAE\xE0\xA4\xB9\xE0\xA4\xB8\xE0\xA5\x81\xE0\xA4\xB8"; // "महसुस"

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

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"महसुस");

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

通常情况下,您最好不要从配置文件中读取此类文本。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

如果您将系统区域设置设置为英语,并且该文件是没有BOM的UTF-8,VC将允许您按原样存储该字符串。 I have written an article about this here.

enter image description here