为什么没有 UTF-24 这种编码?

2017-10-22 00:28:38 +08:00
 asiufasd
unicode 有 17 个 code plane,总共规划了 1,114,112 个 code point,而 UTF-24 可以表示 16,777,216 个 code point,可以定长编码,每个文字三字节,还比 UTF-32 的编码少了一字节的存储空间,但是为什么没听说过这种编码
6516 次点击
所在节点    程序员
30 条回复
thekll
2017-10-22 00:49:26 +08:00
也没有 3 个字长的地址阿
asiufasd
2017-10-22 01:04:12 +08:00
@thekll 3 字节不是 24 位么,另外 UTF-8 是变长编码,落在 U+0800 ~ U+FFFF 区间的文字也是会表示为三个字节的编码吧,还是我理解或者说的不对?
hjc4869
2017-10-22 01:34:08 +08:00
因为 UTF-16 更实用
hjc4869
2017-10-22 01:39:23 +08:00
为什么不用 UTF-24 ?
https://stackoverflow.com/questions/10143836/why-is-there-no-utf-24
为什么如今 UTF-16 被大规模使用?
http://unicode.org/notes/tn12/
jlsk
2017-10-22 01:48:08 +08:00
非常不利于计算机处理,RGB24 就有过教训了
所有寄存器都是 2 的 n 次方大小
读取 3 个字节只能读 4 个再把多的那个置 0
慢了一倍不止
还有内存对齐问题,非 4n 地址会额外消耗时间片
noli
2017-10-22 01:55:29 +08:00
@jisk UTF 系列的编码通畅都只用于传输和存储,跟寄存器并没有什么必然的关系。

UTF-8 的中文也有三字节的,然而处理前几乎都是转成 4 字节的存进寄存器。
thekll
2017-10-22 02:20:33 +08:00
我上面的回答有点答非所问。
首先,unicode 是一整套的字符编码规范,按现有 codespace 定义,已经可以容纳足够多的字符,目前看来还没有必要再扩展。
其次不要把 UTF 和 unicode 搞混了,UTF-8,UTF-16,UTF-32 是 unicode 的具体编码实现。并不直接表示 codepoint。UTF-8 编码可以是 1 ~ 4 字节,UTF-16 是 2 或者 4 字节,UTF-32 则是 4 字节。
你说的 UTF-24 大概是想增加码空间,正如上面所说没必要,实际好多空间都还没用。
jlsk
2017-10-22 02:26:45 +08:00
@noli 不懂就不要乱说,你光传输和存储永远也不显示?
显示的话不就是要处理吗?

什么“处理前几乎都是转成 4 字节”,谁处理呀?你拿手处理啊!
不 TM 都是 CPU 去处理?
你懂汇编吗?寄存器是啥你知道吗?
一切计算的前提就是寄存器,不存在转完了再进寄存器那一说

多上点学不要信口开河!
thekll
2017-10-22 02:37:43 +08:00
@noli 说的没错。至于 cpu 怎么去处理它,当然是根据不同的数据类型和编码规范进行识别和处理。
noli
2017-10-22 03:12:00 +08:00
@jlsk 太久没人怼我以至于我都快忘了怎么怼不懂装懂的人才能获得最大快感了。

我说的尽寄存器是指,你在某编程语言里面操作字符串中的某字符。
而不是你瞎喷什么转码不使用寄存器。
况且,转码还真的可以不使用通用寄存器,用 AVX 之类的直接就可以大量直接转。

你说你装什么懂行呢?
显示根本就跟寄存器无关。
多读书吧。

拉黑不谢。
jlsk
2017-10-22 03:37:03 +08:00
@noli
各位看客你们说现在的傻逼是不是太多了点?
一个明显不懂底层原理的人,被打脸后死鸭子嘴硬
没兴趣回复它了,爱咋咋地吧

你 Block 我没有任何意义,辩论是给其他人看的,谁有理谁有舆论支持
谁先 Block 等于谁先露怯

我看看看客们支持谁,支持我的请打 call
msg7086
2017-10-22 05:32:59 +08:00
@jlsk 你说的没错,3 字节做不到内存对齐,不利于 CPU 处理。

至于你的发言,我只能说,v2 喷子已经有很多了,阁下一口一个傻逼,还请右转百度贴吧。
v2 不缺喷子,不需要阁下的加入。

已露怯。
msg7086
2017-10-22 05:35:33 +08:00
@noli 顺便提一句,AVX 2 从内存中载入也是要边界对齐的,否则影响性能。
虽然实际并不会有多大的数据量导致这么显著的性能差异就是了。
dishonest
2017-10-22 08:31:02 +08:00
@noli 跟你意见相左就拉黑,这完全也太小家子气了,人家也没攻击你吧。小孩子似的。
wwqgtxx
2017-10-22 08:53:18 +08:00
@noli 从内部实现来说,就算你存在一条指令可以不用显示的把数据拷贝到寄存器,他内部是实现依然是要把数据从内存拷贝过去,只不过 CPU 内部帮你完成了这个操作没给你展现出来而已,所以再怎么地,寄存器这个地方你都绕不过去
另外就是内存对齐的问题,你看看 gcc\llvm 之内的编译的代码,很多 class/struct 的内容就算不是 4 或者 8 的倍数他也会强行填充到这个大小,难道人家写编译器的人都是智障么
zhidian
2017-10-22 09:46:24 +08:00
power of 2
noli
2017-10-22 12:02:49 +08:00
@wwqgtxx

“转码还真的可以不使用通用寄存器,用 AVX 之类的直接就可以大量直接转”

你是没看到我说什么,还是没看懂什么叫通用寄存器?还是不知道 AVX 指令使用的是非通用寄存器?

gcc\llvm 要处理的数据都是要放到通用寄存器里面的,当然转成内存对齐的咯。
noli
2017-10-22 12:05:46 +08:00
@dishonest 那要不我回你一句“多事”“没有帮助”,然后再和你说,你敢把我拉黑就是小孩子气?

“最烦那些劝我大度的人,你知道我经历了什么,你死不死”——郭德纲

走好不送,同拉黑,最烦那些没什么料还劝人大度的。
noli
2017-10-22 12:24:09 +08:00
@msg7086

用 AVX 处理字符编码其实我还真没做过,甚至都没见过。

仔细想想的话,对于变长编码类型来说,什么 AVX 乃至并行算法其实都是不可行的。
因为这些编码格式本来就只考虑流式处理,而不是并行处理。

字符流和用于快速地把数据 copy 到显存、什么的图像编码流,并不一样。

不过即使是图像领域,不也还有 JPEG、PNG 等等的压缩格式嘛,显然其数据单元就不是内存对齐的。

离题了。

我最初的出发点只是想说,设计用于传输和存储的编码格式,是不需要考虑寄存器大小的。

让我意外的是,显然有很多人并不知道什么场合才需要考虑内存对齐。
pagxir
2017-10-22 13:36:42 +08:00
从你们的回复,就能感知到你们水平的排行了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/399575

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX