我需要将utf-8字符串转换为本地8位编码字符串(单个字符由char表示)并保持结果字符串中的字符数相同。所以,我希望原始utf字符串中的不可转换字符成为结果字符串中的空格。不幸的是,boost :: locale :: conv :: from_utf不提供这种转换方法。它只提供两个:
enum boost::locale::conv::method_type { boost::locale::conv::skip = 0, boost::locale::conv::stop = 1, boost::locale::conv::default_method = skip }
这意味着您可以跳过不可转换的字符(然后结果字符串会更短)或引发异常。
我发现转换工作的唯一方法就是我想要使用boost - 迭代字符串,将每个字符转换为本地8位编码,在该过程中捕获异常并手动插入空格。但是,这种方法效率不高,导致更多的编码转换。这是代码:
std::string from_utf8_to_local(
const std::string& str,
const std::locale& loc)
{
std::u32string utext = boost::locale::conv::utf_to_utf<char32_t>(str);
std::string textLocal;
for(char32_t ch : utext)
{
std::string newChar;
try
{
std::u32string convStr;
convStr += ch;
std::string utf8Str =
boost::locale::conv::utf_to_utf<char>(convStr);
newChar = boost::locale::conv::from_utf(
utf8Str,
loc,
boost::locale::conv::stop);
}
catch(boost::locale::conv::conversion_error& /*error*/)
{
newChar = " ";
}
textLocal.append(newChar);
}
return textLocal;
}
问题是:
有没有办法用boost或stl以正确的方式做同样的事情?
如果没有,我怎么能与其他图书馆一起做?