在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字符串。