Unicode UTF-16如何实现自同步?
我知道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中,BMP之外的字符用In表示,第一个(CU)位于0xD800-0xDBFF之间,第二个位于0xDC00-0xDFFF之间。每个CU代表代码点的10位。BMP中的字符按自身编码 现在同步很容易。给定任意代码单元的位置:
- 如果代码单元在0xD800-0xDBFF范围内,则它是两个代码单元中的第一个,只需读取下一个并解码即可。瞧,我们在BMP之外有一个完整的角色
- 如果代码单元在0xDC00-0xDFFF范围内,它是两个代码单元中的第二个,只需返回一个单元读取第一部分,或前进到下一个单元跳过当前字符
- 如果它不在这两个范围内,那么它就是BMP中的一个字符。我们不需要再做什么了
当然,这意味着UTF-16可能不适合在没有纠错/检测的介质上工作,比如裸网络环境。但是,在适当的本地环境中,这比不使用自同步要好得多。例如,每次按Backspace键时,您必须从头开始迭代以知道删除了哪个字符,因为在糟糕的Shift JIS编码中,如果没有长度映射,无法知道光标前的字符有多长时间您知道这有什么实际用途吗?我想不出任何跳转到代码单元序列中间的用例。基于位置拆分文本应位于字形边界处。@TomBlodget此用法已在上面的wikipedia引用中。随机阅读比你想象的更普遍。例如,如果我们需要获取文件的最后几个字符/单词,那么自同步允许我们快速完成,而不是从一开始就解析
grep
也可以搜索整个文件,而不是分成句子,然后当它找到匹配项时,它将确认并打印该行。如果没有自同步,这是不可能的。文本编辑器还可以利用自同步来更有效地处理大型文件。例如,如果删除一个字符,它会立即知道应该输出什么。在旧的日语DOS/V中,由于缺乏自同步,每次按backspace时,它都必须从头开始重新分析整个缓冲区,因为它不知道要返回多少字节才能获得上一个缓冲区character@Astara所以你在跟我抱怨为什么UTF-16不能在字节级进行自同步?我不是那个设计编码方案的人,我也不在乎that@Astara然后再读一遍问题。里面没有一个“字节”字。OP并不关心它,只是询问UTF-16如何实现自同步