![为什么 inputenc 在定义八位字节解析时会跳过字符?](https://linux22.com/image/456329/%E4%B8%BA%E4%BB%80%E4%B9%88%20inputenc%20%E5%9C%A8%E5%AE%9A%E4%B9%89%E5%85%AB%E4%BD%8D%E5%AD%97%E8%8A%82%E8%A7%A3%E6%9E%90%E6%97%B6%E4%BC%9A%E8%B7%B3%E8%BF%87%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
Unicode 字符的 UTF-8 表示可能需要最多四个八位字节来定义。
如果一个八位字节从“00”到“7F”,则它是一个单个字符。如果它从“C0”到“DF”,则它是一个双八位字节字符的第一个八位字节,其中“E0”到“EF 和“F0”到“F7”分别表示三八位字节字符和四八位字节字符的第一个八位字节。如果它从“80”到“BF”,则它是一个由上述三种“第一个八位字节”之一开始的字符的延续。(来源:https://stackoverflow.com/questions/5290182/how-many-bytes-does-one-unicode-character-take,https://www.wikiwand.com/en/UTF-8)
然而,在“通过 inputenc 提供一些 UTF-8 支持”(https://texdoc.org/serve/utf8ienc.pdf/0),而是提到两个、三个、四个八位字节和连续字符的第一个八位字节的范围分别是“C2 到”DF、“E0 到”EF、“F0 到”F3 和“80 到”B9。
造成差异的原因是什么?即“C0”、“C1”、“F4 至 F7”和“BA 至 BF”在哪里?
答案1
您无法创建以 C0 或 C1 开头的 UTF8 代码。需要两个字节的最低 Unicode 是 80,即1000 0000
二进制。(它是 € 字符,但现在这并不重要)。您只有 6 位将其保存到第二个字节,因为第二个字节必须以 为前缀10
。因此,我们将二进制数除以 2+6:。10 000000
第一部分必须保存到以 为前缀的第一个字节110
,即110 00010
,第二部分保存到以 为前缀的第二个字节10
,即10 000000
。生成的 UTF8 代码是11000010 10000000
,即 C2 80。