我的问题很简单,但到目前为止我找不到解决方案:

如何在C++中将UTF8编码的string转换为latin1编码的string,而又不使用任何类似libiconv的库?

到目前为止,我能找到的每个示例都是将latin1转换为UTF8的?

最佳答案

typedef unsigned value_type;

template <typename Iterator>
size_t get_length (Iterator p)
{
    unsigned char c = static_cast<unsigned char> (*p);
    if (c < 0x80) return 1;
    else if (!(c & 0x20)) return 2;
    else if (!(c & 0x10)) return 3;
    else if (!(c & 0x08)) return 4;
    else if (!(c & 0x04)) return 5;
    else return 6;
}

template <typename Iterator>
value_type get_value (Iterator p)
{
    size_t len = get_length (p);

    if (len == 1)
    return *p;

    value_type res = static_cast<unsigned char> (
                                    *p & (0xff >> (len + 1)))
                                     << ((len - 1) * 6);

    for (--len; len; --len)
        res |= (static_cast<unsigned char> (*(++p)) - 0x80) << ((len - 1) * 6);

    return res;
}

该函数将把unicode代码点返回到p。您现在可以使用
for (std::string::iterator p = s_utf8.begin(); p != s_utf8.end(); ++p)
{
     value_type value = get_value<std::string::iterator&>(p));
     if (value > 0xff)
         throw "AAAAAH!";
     s_latin1.append(static_cast<char>(value));
}

不保证,代码已经很老了:)

关于c++ - 如何在C/C++中将字符串从UTF8转换为Latin1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12855643/

10-10 14:07