【问题标题】:Why UTF-32 uses four bytes?为什么 UTF-32 使用四个字节?
【发布时间】:2017-06-30 19:57:15
【问题描述】:

如果 UTF-32 是 UCS-4 限制为 17 个平面(1114111 个字符点),需要 21 位,那么第四个字节在做什么?

【问题讨论】:

  • 坦率地说:因为它可以,而且在大多数计算机中使用 32 位值很容易。

标签: encoding utf-32


【解决方案1】:

第四个字节就坐在那里,占用空间(用0填充)。

理论上,可以设计 21 位或 24 位交换格式。在实践中,这两者都很尴尬。很少(如果有的话)现代计算机具有 21 位或 24 位数据类型。由于 32 位字很容易使用,因此通常使用它们来存储最大值远小于 231-1 的数值数据类型。

【讨论】:

  • 我知道位对齐数字在某些平台上可能难以实现,但是 4B 数据类型比 3B 数据类型更容易使用吗? sizeof char32_t 可以是 3,int32_t 应该是用来存储大整数的吧?
  • (字符是整数。)假设它是 3 个字节(所以它实际上是 char24_t :))。它的对齐要求是什么? 3 不是有效答案;没有硬件具有 3 字节对齐。但是如果它的对齐是 2 或 4,你如何排列它们的向量,使它们都对齐?如果对齐是一个,那么在无法执行未对齐负载的硬件上会发生什么?硬件往往没有 3 字节负载。如果 char24_t 占用一个页面的最后三个字节,并且如果访问下一页会出现页面错误,如何将它放入寄存器?
  • SSE 指令将 FWIK 内存对齐用于单个周期中的多个数字操作。字符串没有这种需要,只有顺序或随机访问 R/W。对齐的负载可能会稍微加快一点,我可以看到好处,即标记短字符串(以 25% 的内存为代价)。但是,是的,这是有原因的。
  • 宽字符的关键在于您将它们作为单个整数访问,而不是作为字节串访问。因此,您通常希望能够将单个 21 位字符代码加载为单个原子加载。
  • 字符在语义上不是整数,我们以不同的方式对待它们的字节并为它们使用不同的指令。整数可以相乘,大数据类型在这里是合理的。字符旨在作为具有频繁顺序操作的字符串进行访问。要替换一个字符,我们只需要固定宽度,而不是对齐。我知道使用 32 位寄存器可能会使用一个额外的操作来加载 24 位内存空间。但是对于较长的字符串(通常是复制的),这种微优化的内存权衡通常太多了。我接受了你的回答。
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2011-09-23
  • 2022-01-25
  • 2020-02-17
  • 2016-11-14
  • 2014-05-09
相关资源
最近更新 更多