将字符转换为UTF-8的逻辑

时间:2013-08-01 15:32:49

标签: c++ c utf-8 character-encoding mbcs

我有以下代码,代码中的注释表示它会将大于7F的任何字符转换为UTF-8。我对此代码有以下问题:

if((const unsigned char)c > 0x7F)
  {
    Buffer[0] = 0xC0 | ((unsigned char)c >> 6);
    Buffer[1] = 0x80 | ((unsigned char)c & 0x3F);
    return Buffer;
  }
  1. 此代码如何运作?
  2. 我使用的当前Windows代码页对Buffer中放置的字符有影响吗?

1 个答案:

答案 0 :(得分:10)

对于初学者来说,代码通常不起作用。通过 巧合,它是如果 char(或unsigned char)中的编码是ISO-8859-1,因为ISO-8859-1具有相同的代码 指向前256个Unicode代码点。但ISO-8859-1有 很大程度上被ISO-8859-15所取代,所以它可能不会 工作。 (例如,尝试使用0xA4。欧元登录 ISO-8859-15。它会给你一个完全不同的 性格。)

有两种正确的方法可以进行此转换,这两种方法都是如此 取决于知道输入字节的编码(哪个 意味着您可能需要多个版本的代码,具体取决于 关于编码)。最简单的就是拥有一个数组 256个字符串,每个字符一个,以及索引。其中 例如,您不需要if。另一种是翻译 代码转换为Unicode代码点(32位UTF-32),并进行翻译 进入UTF-8(对于某些人来说可能需要两个以上的字节) 字符:欧元字符是0x20AC:0xE2,0x82,0xAC)。

编辑:

有关UTF-8的详细介绍: http://www.cl.cam.ac.uk/~mgk25/unicode.html。标题说 适用于Unix / Linux,但系统很少(如果有的话) 其中的具体信息(这些信息很清楚 标记)。