我有一些读取unicode代码点的代码(以字符串0xF00进行转义)。
由于即时通讯使用boost,因此我推测以下方法是否是最佳(也是正确的)方法:
unsigned int codepoint{0xF00};
boost::locale::conv::utf_to_utf<char>(&codepoint, &codepoint+1);
?
最佳答案
如前所述,这种形式的代码点(通常是UTF-32),所以您要查找的是转码。
对于不依赖自C++ 17以来不推荐使用的功能并且不是很丑陋且不需要大量第三方库的解决方案,可以使用非常轻便的UTF8-CPP(四个小标题!)及其函数utf8::utf32to8
。
它看起来像这样:
const uint32_t codepoint{0xF00};
std::vector<unsigned char> result;
try
{
utf8::utf32to8(&codepoint, &codepoint + 1, std::back_inserter(result));
}
catch (const utf8::invalid_code_point&)
{
// something
}
(如果您对异常过敏,也可以使用
utf8::unchecked::utf32to8
。)(并考虑从C++ 20开始读入
vector<char8_t>
或std::u8string
)。(最后,请注意,我专门使用了
uint32_t
来确保输入具有正确的宽度。)我倾向于在项目中使用该库,直到我需要一些其他用途的东西为止(此时,我通常会切换到ICU)。