当您将代码点编码为基于UTF-8的代码单元时,如果代码点适合7位,则最重要的位设置为零,以便它告诉您它是存储在1字节(或更准确地说是7位)上的字符。
如果代码点占用7位以上,那么第一个字节的前导1位数就会告诉您,有多少个代码单元构成了给定的代码点。根据规范,这个序列的一个位总是跟随一个单位零位,它终止它并因此将它从代码点的开始分离出来。
我有具体的问题,请单独回答。
1)如果第一个字节使代码点读取的字节数非常清楚,为什么每个连续字节的前2位被设置为“10”?如果你确切知道有多少字节,为什么它们是必要的?他们似乎在浪费宝贵的空间。
2)第二个问题是UTF-8的理论极限是什么?由于兼容性原因,UTF-8将始终编码最多4个代码单元.但是其他人说,理论上它可以将代码点编码到多达7个代码单元,这意味着第一个字节不包含任何代码点位。它是7位,然后是结束零。但是,如果我们开始建立理论,那么我们可以说,UTF-8也可以编码到任意数量的代码单位,如果我们不限制大小指示为第一个字节。例如,52位不存在的代码点0x8000000000000可以存储如下:
1111 1111 - 1100 1000 000万1000 000 000 000
这意味着这个字符存储在10个字节上。
发布于 2019-11-15 22:16:13
对问题1的回答:为什么每个连续字节的前2位被设置为“10”?
它允许您在序列中的任意位置着陆,并明确地返回到当前代码点的开头(或转发到下一个代码点的开始)。
如果您是从序列的开头开始,那么您知道第一个字节是一个前导字节,并且可以从那里向前工作-容易。但是,如果我们不这样做,如果我们不强制从顶到顶的连续字节的第二位为零,那么我们就无法区分某些连续字节和开始字节。
例如:110xxxxx 10xxxxxx,但是在这样一个世界中,我们不强制0在字节2和挤压7位有用的数据在第二个字节,我们可以让11011111 11011111作为一个合法的字符编码,我们不能再知道从哪里开始。
正如@ErikEidt在评论中所指出的,它是自同步。您可以在序列中的任意位置被丢弃,并备份不超过3个字节以找到一个明确的前导字节。您也永远找不到较短的代码隐藏在较长的代码中:如果没有这些属性,您就无法在快速恒定的时间内从这个代码点转到前一个代码点(如@gnasher729注释中所强调的那样)。这意味着您可以反向处理UTF-8字符串,其开销与向前工作的开销大致相同。
对问题2的回答: UTF-8的理论极限是什么?
我想我不能比埃里克对这个问题的评论更好了。我将在此为后人复制这个问题:
我认为你的第二点假设是可能的。此外,我们不必保持相同的
11111111模式,不需要一次只扩展一个字节,也不需要每次只扩展一个字节的数据。技术上所需要的是能够对表单进行积极的区分,而且有很多方法可以在单个代码中混合不同的方法。- Erik Eidt
https://softwareengineering.stackexchange.com/questions/401160
复制相似问题