UTF-16中的码元(code unit)到底是什么东西?

下午看了很多UTF-16的资料,对码元(code unit)的概念反而变得模糊了。

从这个字面意思来看,似乎是想表达“编码的单元” unit of code 的意思。
在某篇文章里,说码元是字符的编码存储在计算机中产生出的概念,换句话说,在UTF-16中,如果某个字符用了16bits的一个整数来映射,在保存时,它就需要消耗2个bytes,因此code unit = 2。
同理,如果是需要使用2个16bits的一个整数映射了某字符,那么该字符的code unit =4。

但是,在UTF-16的WIKI中,有这样一句:

第一个Unicode平面(码位从U+0000至U+FFFF)包含了最常用的字符。该平面被称为基本多语言平面,缩写为BMP(Basic Multilingual Plane, BMP)。UTF-16与UCS-2编码这个范围内的码位为16比特长的单个码元,数值等价于对应的码位. BMP中的这些码位是仅有的可以在UCS-2中表示的码位。

从这句话来看,码元应该就是指“16bits长的最小存储单位”,我个人感觉这才是对的,如果码元=字节数,那似乎太不直观了吧,还不如用字节算了。

求证实!

阅读 6.1k
1 个回答

很不错的问题,已赞。

我仔细看了你引用的维基百科的链接,看了对应的英文版,确认了不是翻译的问题。

我的回答可能不正确,仅供参考吧


字节是一个存储概念,码元是一个通讯编码传输概念。

  • ASCII 码元是 7 bit

  • UTF-8 码元是 8 bit

  • UTF-16 码元 16 bit

  • ....

你在问题描述中也提到了,码元是编码的单元

编码 Character_encoding中有一个例子:

Example of a code unit: Consider a string of the letters "abc"
followed by U+10400 ? DESERET CAPITAL LETTER LONG I (represented with
1 char32_t, 2 char16_t or 4 char8_t). That string contains:

  • four characters;

  • four code points

  • either:

    • four code units in UTF-32 (00000061, 00000062, 00000063, 00010400)

    • five code units in UTF-16 (0061, 0062, 0063, d801, dc00), or

    • seven code units in UTF-8 (61, 62, 63, f0, 90, 90, 80).

UTF-* 是编码,UCS(Unicode)是字符集。

UTF-16 与 UCS-2 编码这个范围内的码位为 16 比特长的单个码元,数值等价于对应的码位....

因为 UTF 是变长编码,所以在第一平面的编码为 16 bit。

The encoding is variable-length, as code points are encoded with one or two 16-bit code units.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进