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

gab*_*iel 5 c c++ utf-8 iso-8859-1 character-encoding

我正在用C++改变软件,用ISO Latin 1格式处理文本,以便在SQLite中的数据库中存储数据.
问题是SQLite在UTF-8中工作......并且使用相同数据库的Java模块在UTF-8中工作.

我希望有一种方法可以在存储到数据库之前将ISO Latin 1字符转换为UTF-8字符.我需要它在Windows和Mac上工作.

我听说ICU会这样做,但我觉得它太臃肿了.对于这两个字符集,我只需要一个简单的转换系统(最好来回).

我该怎么办?

Eva*_*ran 16

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));
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见http://en.wikipedia.org/wiki/UTF-8#Description.

编辑:根据ninjalj的评论,latin-1将direclty转换为前256个unicode代码点,因此上述算法应该可行.

  • 正如我所说,如果它是**真正的**Latin1.Windows CP1252(有时错误地称为Latin1)具有其他字符(在ISO-8859中为控制字符保留的范围),最值得注意的是,打开和关闭引号的版本. (2认同)
  • 哦,所以下面没有; ;-P (2认同)
  • ((ch&0xc0)&gt;&gt; 6`是多余的。您可以只写“ ch &gt;&gt; 6”。 (2认同)