C ++标准模板库(STL)是否提供将UTF8编码的字节缓冲区转换为wstring的任何方法?
例如:
const unsigned char* szBuf = (const unsigned char*) "d\xC3\xA9j\xC3\xA0 vu";
std::wstring str = method(szBuf); // Should assign "déjà vu" to str
我想避免实现我自己的UTF8转换代码,如下所示:
const unsigned char* pch = szBuf;
while (*pch != 0)
{
if ((*pch & 0x80) == 0)
{
str += *pch++;
}
else if ((*pch & 0xE0) == 0xC0 && (pch[1] & 0xC0) == 0x80)
{
wchar_t ch = (((*pch & 0x1F) >> 2) << 8) +
((*pch & 0x03) << 6) +
(pch[1] & 0x3F);
str += ch;
pch += 2;
}
else if (...)
{
// other cases omitted
}
}
编辑:感谢您的意见和答案。此代码片段执行所需的转换:
std::wstring_convert<std::codecvt_utf8<wchar_t>,wchar_t> convert;
str = convert.from_bytes((const char*)szBuf);
答案 0 :(得分:0)
在C ++ 11中,您可以使用std::codecvt_utf8
。如果你没有,可以能够说服iconv
做你想做的事情;不幸的是,这也不是普遍存在,并非所有支持UTF-8的实现,我都不知道任何方法找出传递给iconv_open
做的适当的事情来自wchar_t
的转换。
如果您没有这些东西,最好的选择是第三方库,例如ICU。令人惊讶的是,Boost似乎没有任何目的,尽管我可能错过了它。