你会认为这很容易获得,但我很难找到一个简单的库函数,它将C或C ++字符串从ISO-8859-1编码转换为UTF-8。我正在读取8位ISO-8859-1编码的数据,但需要将其转换为UTF-8字符串,以便在SQLite数据库和最终的Android应用程序中使用。
我发现了一种商业产品,但目前超出了我的预算范围。
答案 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 中存储特殊字符。那么你到底想转换什么?