如何在C ++多平台中将(char *)从ISO-8859-1转换为UTF-8?

我正在用C ++改变软件,用ISO Latin 1格式处理文本,以便在SQLite中的数据库中存储数据。 问题是SQLite在UTF-8中工作......并且使用相同数据库的Java模块在UTF-8中工作。 我希望有一种方法可以在存储到数据库之前将ISO Latin 1字符转换为UTF-8字符。我需要它在Windows和Mac上工作。 我听说ICU会这样做,但我觉得它太臃肿了。对于这两个字符集,我只需要一个简单的转换系统(最好来回)。 我该怎么办?     
已邀请:
ISO-8859-1被纳入ISO / IEC 10646和Unicode的前256个代码点。所以转换非常简单。 对于每个char:
uint8_t ch = code_point; /* assume that code points above 0xff are impossible since latin-1 is 8-bit */

if(ch < 0x80) {
    append(ch);
} else {
    append(0xc0 | (ch & 0xc0) >> 6); /* first byte, simplified since our range is only 8-bits */
    append(0x80 | (ch & 0x3f));
}
有关详细信息,请参见http://en.wikipedia.org/wiki/UTF-8#Description。 编辑:根据ninjalj的评论,latin-1将direclty转换为前256个unicode代码点,因此上述算法应该可行。     
如果通用字符集框架(如iconv)对你来说过于臃肿,请自行编辑。 编写一个静态转换表(char到UTF-8序列),汇总你自己的翻译。根据你对字符串存储使用的内容(char缓冲区,或者std :: string或者什么),它看起来会有所不同,但是想法是 - 滚动源代码字符串,用代码127替换每个字符的UTF-8对应字符串。由于这可能会增加字符串长度,因此在适当的位置进行操作会相当不方便。为了获得额外的好处,您可以通过两次传递:传递一个确定必要的目标字符串大小,传递两个执行转换。     
TO 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;
}
    
如果你不介意做一个额外的副本,你可以“扩展”你的ISO Latin 1字符到16位字符,从而得到UTF-16。然后你可以使用类似UTF8-CPP的东西将它转换为UTF-8。 事实上,我认为UTF8-CPP甚至可以直接将ISO Latin 1转换为UTF-8(utf16to8功能),但您可能会收到警告。 当然,它需要是真正的ISO Latin 1,而不是Windows CP 1232。     

要回复问题请先登录注册