UTF-16如何实现自同步?

问题描述 投票:0回答:1

我知道UTF-16是一种自同步编码方案。我也阅读了下面的Wiki,但是并没有得到它。

Self Synchronizing Code

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

unicode character-encoding utf-16 data-synchronization
1个回答
0
投票

在UTF-16中,使用surrogate pair in表示BMP之外的字符,第一个代码单元位于0xD800-0xDBFF之间,第二个代码单元位于0xDC00-0xDFFF之间。每个CU代表10位代码点。 BMP中的字符保持原样。

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

  • 如果代码单元在0xD800-0xDBFF范围内,则它是第一个代码单元2,只需读取下一个代码单元并进行解码。 Voilà,我们在BMP之外有一个完整的角色
  • 如果代码单元在0xDC00-0xDFFF范围内,则它是第二个代码单元2,只需返回一个单元读取第一个部分,或前进到下一个单元跳过当前字符
  • 如果它不在这两个范围内,那么它就是BMP中的一个角色。我们不需要再做任何事情了

自我同步的关键是要知道我们是否立即处于某事的中间而不必从开始检查中再次阅读。 UTF-16允许我们这样做

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

https://en.wikipedia.org/wiki/UTF-16#Description

© www.soinside.com 2019 - 2024. All rights reserved.