回应
中的讨论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而无需操作?
答案 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,则需要应用修补程序
答案 4 :(得分:1)
如果您将系统区域设置设置为英语,并且该文件是没有BOM的UTF-8,VC将允许您按原样存储该字符串。 I have written an article about this here.