首页 > 解决方案 > 16 位编码,所有位都映射到某个值

问题描述

UTF-32 的最后一位归零。据我了解,UTF-16 也不使用它的所有位。

是否有 16 位编码将所有位组合映射到某个值,最好是 UTF 的子集,例如 7 位的 ASCII?

标签: unicodeencodingutf-16utf16-bit

解决方案


UTF-32 的最后一位归零

这可能不正确,具体取决于您的计数方式。通常我们从左数,所以 UTF-32 的高(即第一位)位将为零

据我了解,UTF-16 也不使用它的所有位

也不正确。UTF-16 使用它的所有位。只是范围 [0xD800—0xDFFF] 是为UTF-16 代理对保留的,因此这些值永远不会被分配任何字符,也永远不会出现在 UTF-32 中。如果您需要使用 UTF-16 对 BMP 之外的字符进行编码,则将使用这些值

事实上,Unicode 被限制为 U+10FFFF 只是因为 UTF-16,尽管 UTF-8 和 UTF-32 本身能够分别表示最多 U+7FFFFFFF 和 U+FFFFFFFF。代理对的使用使得无法在 UTF-16 中对大于 0x10FFFF 的值进行编码

请参阅为什么 Unicode 被限制为 0x10FFFF?

是否有 16 位编码将所有位组合映射到某个值,最好是 UTF 的子集,例如 7 位的 ASCII?

首先,没有“UTF 的子集”之类的东西,因为UTF 不是字符集,而是一种编码 Unicode 代码点的方法

在 UTF-16 存在之前,Unicode 是使用UCS-2编码的固定 16 位字符集。因此,UCS-2 可能是您将得到的最接近的,它仅编码 BMP 中的字符。其他固定的 16 位非 Unicode 字符集也具有将所有位组合映射到某些字符的编码

但是,您为什么要那样做?UCS-2 早就被弃用了。一些旧工具和经验不足的程序员仍然暗示 Unicode 始终是 16 位长,这是正确的,并且会破坏现代文本处理

另请注意,并非所有低于 0xFFFF 的值都已分配,因此没有编码可以将每个 16 位值映射到 Unicode 代码点

进一步阅读


推荐阅读