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

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

我发现了一种商业产品,但这次超出了我的预算。

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

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

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

对于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; } 

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

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

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

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

您可以使用boost :: locale库:

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

代码如下所示:

 #include  std::string utf8_string = to_utf(latin1_string,"Latin1"); 

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

C ++方面 – 将其与iostream集成 – 要困难得多。

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

干杯&hth。,