【问题标题】:Logic behind converting a character to UTF-8将字符转换为 UTF-8 背后的逻辑
【发布时间】:2026-02-05 04:50:02
【问题描述】:

我有以下一段代码,代码中的注释说它将任何大于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.它...按照 UTF-8 编码的定义工作?不然怎么办?
  • @R.MartinhoFernandes:我猜是这样..这段代码不是我写的。它已经工作了一段时间了。所以我猜它是正确的。我想了解它背后的逻辑。
  • @Asha 我想你需要深入研究 utf-8 规范。
  • @Asha 没什么好理解的,假设您知道 |>> 运算符的作用(如果不知道,应该很容易在一些 C++ 学习材料中找到)。 UTF-8 规范说明了每个位需要放在哪里,并且该代码只是将所有位放在它们需要的位置。
  • @R.MartinhoFernandes 除非它没有。该代码假设单字节编码是 Latin-1,它已在很大程度上被 Latin-15 取代。 (我也很好奇Buffer,以及他返回指向它的指针的事实,以及它不是'\0' 终止的事实。我会非常怀疑这段代码。)

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


【解决方案1】:

对于初学者,一般来说,代码不起作用。经过 巧合的是,ifchar(或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,但系统很少(如果有的话) 其中的具体信息(并且这些信息是明确的 标记)。

【讨论】: