c++ - 将字符转换为 UTF-8 背后的逻辑

标签 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 中的字符有任何影响?

最佳答案

对于初学者来说,代码通常不起作用。经过 巧合的是,如果 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/

相关文章:

c - SDL2 : getting segmentation fault with TTF_RenderText after some time?

使用 UTF-8 header 的 Python 2.7 解码错误 : UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3

MATLAB 和字符编码 : How to run/edit an ISO8859-1 m-file in a UTF-8 system?

c++ - 为什么幂函数通常计算为对数?

c - pthread_cond_wait 无限期地阻塞(休眠)直到 pthread_cond_signal 被 C 中的另一个线程调用?

c - 如何在 ANSI C 中从以太网卡获取网络数据包?

java - NetBeans 6.7.1 中的 Unicode

c++ - 错误 : expected unqualified-id before if

c++ - 如何在不同的功能中使用队列?

C++ - 读取 CSV 文件的列并仅保留以特定字符串开头的列