在C / C ++中将ISO-8859-1字符串转换为UTF-8

时间:2010-10-30 17:17:38

标签: c++ c

你会认为这很容易获得,但我很难找到一个简单的库函数,它将C或C ++字符串从ISO-8859-1编码转换为UTF-8。我正在读取8位ISO-8859-1编码的数据,但需要将其转换为UTF-8字符串,以便在SQLite数据库和最终的Android应用程序中使用。

我发现了一种商业产品,但目前超出了我的预算范围。

7 个答案:

答案 0 :(得分:37)

如果您的源编码始终是ISO-8859-1,这是微不足道的。这是一个循环:

unsigned char *in, *out;
while (*in)
    if (*in<128) *out++=*in++;
    else *out++=0xc2+(*in>0xbf), *out++=(*in++&0x3f)+0x80;

为了安全起见,您需要确保输出缓冲区是输入缓冲区的两倍,或者包括大小限制并在循环条件下检查它。

答案 1 :(得分:10)

对于c ++,我使用它:

std::string iso_8859_1_to_utf8(std::string &str)
{
    string strOut;
    for (std::string::iterator it = str.begin(); it != str.end(); ++it)
    {
        uint8_t ch = *it;
        if (ch < 0x80) {
            strOut.push_back(ch);
        }
        else {
            strOut.push_back(0xc0 | ch >> 6);
            strOut.push_back(0x80 | (ch & 0x3f));
        }
    }
    return strOut;
}

答案 2 :(得分:3)

C ++ 03标准不提供直接在特定字符集之间转换的函数。

根据您的操作系统,您可以在Linux上使用iconv(),MultiByteToWideChar()&amp; Windows上的公司。 为字符串转换提供大量支持的库是ICU库,它是开源的。

答案 3 :(得分:2)

如果面对Windows 1252而不是真正的ISO-8859-1,Unicode人员可能会有一些帮助。最终的似乎是this one,它将CP1252中的每个代码点映射到Unicode中的代码点。将Unicode编码为UTF-8是一种简单的练习。

在编译时直接解析该表并从中形成查找表并不困难。

答案 4 :(得分:2)

您可以使用boost :: locale库:

http://www.boost.org/doc/libs/1_49_0/libs/locale/doc/html/charset_handling.html

代码如下所示:

#include <boost/locale.hpp>
std::string utf8_string = to_utf<char>(latin1_string,"Latin1");

答案 5 :(得分:0)

ISO-8859-1到UTF-8仅涉及编码算法,因为ISO-8859-1是Unicode的子集。所以你已经有了Unicode代码点。检查维基百科的算法。

C ++方面 - 将其与iostreams集成 - 要困难得多。

我建议你在那座山上走走,而不是试图穿过它或攀爬它,也就是说,实现一个简单的字符串到字符串转换器。

干杯&amp;第h。,

答案 6 :(得分:0)

为什么你需要 -1 而不是 -7。根据我对 sql 的测试,您甚至不能在 -1 中存储特殊字符。那么你到底想转换什么?