我有以下代码,代码中的注释说它将任何大于 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;
}
- 这段代码是如何工作的?
- 我当前使用的 Windows 代码页是否对放置在
Buffer
中的字符有任何影响?
最佳答案
对于初学者来说,代码通常不起作用。经过
巧合的是,如果 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(某些情况下可能需要两个以上的字节
characters: 欧元字符是 0x20AC: 0xE2, 0x82, 0xAC).
编辑:
有关 UTF-8 的详细介绍: http://www.cl.cam.ac.uk/~mgk25/unicode.html .标题是这么说的 适用于 Unix/Linux,但几乎没有系统 其中的具体信息(这些信息显然是 标记)。
关于c++ - 将字符转换为 UTF-8 背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998410/