回应中的讨论
C++中的跨平台字符串(和Unicode)
如何以跨平台友好的方式处理C/C++中的Unicode字符串?
我正在尝试将UTF-8
字符串分配给Visual Studio 2010
环境中的std::string
变量
std::string msg = "महसुस";
但是,当我查看字符串视图调试器时,我只看到"????"我已将文件保存为Unicode(带签名的UTF-8)我正在使用字符集"使用unicode字符集"
"महसुस"是尼泊尔语,它包含5个字符,将占用15个字节。但visual studio调试器显示消息大小为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"महसुस");
您可以在Watches窗口中编写msg.c_str(), s8
以正确查看UTF-8字符串。
如果您有C++11,您可以编写u8"महसुस"
。否则,您将不得不编写实际的字节序列,对UTF-8序列中的每个字节使用xxx
。
通常,您最好从配置文件中读取这样的文本。
由于's8'格式说明符,有一种方法可以显示正确的值。如果我们将",s8"附加到变量名,Visual Studio将以UTF-8重新分析文本并正确呈现文本:
如果您使用的是Microsoft Visual Studio 2008 Service Pack 1,则需要应用修补程序
http://support.microsoft.com/kb/980263