将utf8编码的字符串转换为本地8位编码的字符串,并用空格替换不可转换的字符

时间:2015-05-02 10:47:00

标签: c++ string boost encoding utf-8

我需要将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以正确的方式做同样的事情?

如果没有,我怎么能与其他图书馆一起做?

0 个答案:

没有答案