Unicode UTF-16如何实现自同步?

Unicode UTF-16如何实现自同步?,unicode,character-encoding,utf-16,data-synchronization,Unicode,Character Encoding,Utf 16,Data Synchronization,我知道UTF-16是一种自同步编码方案。我也读了下面的维基,但没有完全理解 你能给我解释一下UTF-16的例子吗?在UTF-16中,BMP之外的字符用In表示,第一个(CU)位于0xD800-0xDBFF之间,第二个位于0xDC00-0xDFFF之间。每个CU代表代码点的10位。BMP中的字符按自身编码 现在同步很容易。给定任意代码单元的位置: 如果代码单元在0xD800-0xDBFF范围内,则它是两个代码单元中的第一个,只需读取下一个并解码即可。瞧,我们在BMP之外有一个完整的角色 如果代

我知道UTF-16是一种自同步编码方案。我也读了下面的维基,但没有完全理解


你能给我解释一下UTF-16的例子吗?

在UTF-16中,BMP之外的字符用In表示,第一个(CU)位于0xD800-0xDBFF之间,第二个位于0xDC00-0xDFFF之间。每个CU代表代码点的10位。BMP中的字符按自身编码

现在同步很容易。给定任意代码单元的位置:

  • 如果代码单元在0xD800-0xDBFF范围内,则它是两个代码单元中的第一个,只需读取下一个并解码即可。瞧,我们在BMP之外有一个完整的角色
  • 如果代码单元在0xDC00-0xDFFF范围内,它是两个代码单元中的第二个,只需返回一个单元读取第一部分,或前进到下一个单元跳过当前字符
  • 如果它不在这两个范围内,那么它就是BMP中的一个字符。我们不需要再做什么了
在UTF-16中,CU是单位,即最小的元素。我们在CU级别工作,一个接一个地读取CU,而不是逐字节读取由于这一点以及历史原因,UTF-16只能在CU级别进行自同步。

自动同步的目的是要知道我们是否正处于某个事物的中间,而不是必须从头开始检查。UTF-16允许我们这样做

由于高代理项、低代理项和有效BMP字符的范围为,因此代理项不可能与BMP字符匹配,或者两个相邻字符的(部分)看起来像合法的代理项对。这大大简化了搜索。这也意味着UTF-16在16位字上是自同步的:一个代码单元是否开始一个字符可以在不检查早期代码单元的情况下确定。UTF-8具有这些优点,但许多早期的多字节编码方案(如和其他亚洲多字节编码)不允许明确的搜索,只能通过从字符串开始重新解析来同步(如果一个字节丢失或遍历从随机字节开始,UTF-16不是自同步)


当然,这意味着UTF-16可能不适合在没有纠错/检测的介质上工作,比如裸网络环境。但是,在适当的本地环境中,这比不使用自同步要好得多。例如,每次按Backspace键时,您必须从头开始迭代以知道删除了哪个字符,因为在糟糕的Shift JIS编码中,如果没有长度映射,无法知道光标前的字符有多长时间

您知道这有什么实际用途吗?我想不出任何跳转到代码单元序列中间的用例。基于位置拆分文本应位于字形边界处。@TomBlodget此用法已在上面的wikipedia引用中。随机阅读比你想象的更普遍。例如,如果我们需要获取文件的最后几个字符/单词,那么自同步允许我们快速完成,而不是从一开始就解析
grep
也可以搜索整个文件,而不是分成句子,然后当它找到匹配项时,它将确认并打印该行。如果没有自同步,这是不可能的。文本编辑器还可以利用自同步来更有效地处理大型文件。例如,如果删除一个字符,它会立即知道应该输出什么。在旧的日语DOS/V中,由于缺乏自同步,每次按backspace时,它都必须从头开始重新分析整个缓冲区,因为它不知道要返回多少字节才能获得上一个缓冲区character@Astara所以你在跟我抱怨为什么UTF-16不能在字节级进行自同步?我不是那个设计编码方案的人,我也不在乎that@Astara然后再读一遍问题。里面没有一个“字节”字。OP并不关心它,只是询问UTF-16如何实现自同步