0

我有以下代码,代码中的注释说它将任何大于7FUTF-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吗?
4

1 回答 1

10

对于初学者来说,代码通常不起作用。巧合的是,如果char(or ) 中的编码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,但其中几乎没有系统特定信息(如果有的话)(并且这些信息已明确标记)。

于 2013-08-01T15:45:16.590 回答