我熟悉了有关 Unicode 的维基百科页面,但不理解它,尽管它在那里说这是一个字符编码标准
据我所知,Unicode表示如下
0x00000000 - 0x0010F800
有一种说法是UTF-16 = Unicode,是真的吗?
UTF-16 表示为 256*256 = 65 536(没有代理对),有代理对的公式是 2^20+2^16−2048 - 不清楚这样的公式是怎么来的,懂行的可以解释一下(没有代理对,一切都很清楚)
UTF-8表示如下
4字节(用什么)
0x00000000 - 0x001FFFFF
6 个字节(未使用的)
0x00000000 - 0x7FFFFFFF
这里问题似乎在酝酿,如果 Unicode 编码的字符少 2 倍,我们如何从 UTF-8 转换为 Unicode?
什么是 Unicode,为什么我们要从同一个 UTF-8 翻译成它?
PS 脑子里的粥,我已经糊涂了X_X,帮我理清头绪
总结评论和聊天中写的内容。注意:这个答案并不假装是一个严格的规范,而是一个“在手指上”的解释,以提高理解,可能包含不准确之处,对于程序开发,最好不要阅读 SO 甚至维基百科,而是阅读标准本身。
在问题的上下文中,Unicode只是一个字符表和分配给它们的整数(不是任何字节,而是普通的人类数字)。(并且 Unicode 还描述了字符的处理以及它们之间的相互转换,但问题不在于此。)
这块牌匾的一块:
此表并未准确说明这些数字如何转换为可存储在计算机中的字节。但是为了在计算机中存储 unicode,毕竟必须有人指定如何翻译它们!
让我们从这个字符表中取出数字并将它们填充到四个字节中,以便四个字节代表一个无符号整数(unsigned int,uint32)。也就是说,例如,从字母“I”的代码 42F 16我们得到 bytes
00 00 04 2F。这样,我们就得到了最简单的UTF-32编码(UTF-32-BE 1 , UCS-4)。如果我们将接收到的这四个字节解释为一个无符号整数,那么我们就得到了 Unicode 盘中的字符编号。通过澄清我们使用的是 uint32,我们可以假设UTF-32 = Unicode:每个数字都按原样编码解码,没有任何转换。
如果我们从表中取出数字并将它们塞入表示无符号整数(unsigned short,uint16)的两个字节中,那么我们将获得Unicode 的第一个版本,它是在 1991 年。然后字符数被限制在65536个,他们所有的代码都可以很容易地用两个字节表示,不需要额外的转换。
但后来他们认为 65,000 是不够的,并将最大字符数增加到 100 万。但毕竟不能把一百万塞进两个字节,每个字符需要占用更多的字节。但是由于已经出现了依赖这两个字节的程序(例如,在 Java 或 Windows NT 中,一个字符的长度仍然是 2 个字节),那么为了至少保持一定的向后兼容性,D800 16范围是撕掉这两个字节. .DFFF 16并表示这些是代理项对,占用四个字节,并根据代码为 10000 16及以上字符的特殊算法进行处理。他们称其为UTF-16 编码。
因此,在 UTF-16 中,Unicode 表中落在 0000 16 ..D7FF 16和 E000 16 ..FFFF 16范围内的数字按原样写为两个字节,代码为 10000 16和更大的字符写为代理项与使用范围 D800 16 ..DFFF 16配对并占用四个字节。因此,如果不使用代理对,为 Unicode 的第一个两字节版本制作的旧应用程序可以继续使用它。
于是,同一个字母“I”(代码42F 16)在UTF-16(UTF-16-BE)中表示为
04 2F,代码1F512 16不适合两个字节的字符“🔒”被转换根据算法分成四个字节D8 3D DD 12。因为这些非常代理对与一堆UTF-16 ≠ Unicode转换。
UTF-8是为了与 ASCII 兼容而设计的:在其中,从 0 到 7F 16的字符代码按原样写入一个字节,最终给出相同的 ASCII,而其他所有内容都使用比 UTF-16 更棘手的算法进行编码, 所以UTF-8 ≠ Unicode也是。
从技术上讲,UTF-8 最多允许编码 20 亿个数字,但 Unicode 限制为一百万个字符,并且标准规定禁止使用 UTF-8 对不在 Unicode 允许范围内的数字进行编码。因此,将非 Unicode 数字从 UTF-8 转换为 Unicode 根本没有问题:在这种情况下,制作精良的应用程序会抛出错误或将所有无效内容替换为 � 字符。
在 Notepad 和 Notepad++ 中,您可以看到名为“Unicode”的编码,但它实际上是 UTF-16-LE with BOM 1。
(点击放大)
最常见的编码似乎是 UTF-8。
1 - 占用超过一个字节的数字可以用不同的字节顺序书写:例如,数字 259 可以写成
01 03(大端,BE)或03 01(小端,LE)。这同样适用于 UTF-16、UTF-32 和一些其他编码(但不是 UTF-8)中的字符。上面的 🔒 在 UTF-16-LE 中编码为3D D8 12 DD- 而在 UTF-16-BE 中它将是D8 3D DD 12. BOM 是文本开头的一个特殊的 FEFF 16字符,它允许您确定相同的字节顺序 - 在大端中它写为FE FF,在小端中写为 ,并且禁止FF FE使用 FFFE 16字符,这允许你来确定字节顺序。