V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
asiufasd
V2EX  ›  程序员

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

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

    UTF-8 的中文也有三字节的,然而处理前几乎都是转成 4 字节的存进寄存器。
    thekll
        7
    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
        8
    jlsk  
       2017-10-22 02:26:45 +08:00   ❤️ 1
    @noli 不懂就不要乱说,你光传输和存储永远也不显示?
    显示的话不就是要处理吗?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    离题了。

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

    让我意外的是,显然有很多人并不知道什么场合才需要考虑内存对齐。
    pagxir
        20
    pagxir  
       2017-10-22 13:36:42 +08:00 via Android
    从你们的回复,就能感知到你们水平的排行了。
    hjc4869
        21
    hjc4869  
       2017-10-22 13:47:25 +08:00
    @noli 并非不可行,UTF-8 和 UTF-16 互转现在大家都是 SIMD 了,随便 Google 一下就能查得到实现。
    msg7086
        22
    msg7086  
       2017-10-22 14:25:51 +08:00
    @noli UTF-8 最初是为了向后兼容 7-bit,可以在单字节文字的世界里无缝切换,方便推广。
    就说 Windows 上强推 UTF-16 来着,结果搞得各种兼容性问题,宽字符窄字符要死要活的。
    而且 UTF-8 本身可扩展,以前最长可以用到 6 字节,不像 UTF-16 这样定长然后不够用了就 GG。

    流式处理还是怎么处理倒不是最主要的。
    毕竟这玩意不想做视频做图像,动不动就上亿的数据量。
    文字,撑死也就那么点数据,性能并不重要。
    noli
        23
    noli  
       2017-10-22 14:37:32 +08:00 via iPhone
    @hjc4869 我粗略看了一下 AVX 的指令集的一些指令功能,感觉做不出来,不知道怎么做,想不到居然真有实现了的,长见识了。有没有关键字提供一下?
    hjc4869
        24
    hjc4869  
       2017-10-22 15:00:37 +08:00   ❤️ 1
    msg7086
        25
    msg7086  
       2017-10-22 15:12:39 +08:00
    @noli
    @hjc4869
    刚花了时间读了一下,只能感叹做得真精妙。
    (虽然从这大量的位操作就能看出这过程有多么痛苦了……
    pinews
        26
    pinews  
       2017-10-22 20:50:30 +08:00
    如果计算机发源于中国,编码优先考虑汉字的话,楼主说的情况极有可能发生的,说不定还能成为全球唯一编码呢。。
    dishonest
        27
    dishonest  
       2017-10-23 06:33:12 +08:00
    @noli 拉黑吧,好走不送。反正你让我觉得你在生活中一定是个脾气暴躁,动不动就怼天怼地怼空气的人。
    dishonest
        28
    dishonest  
       2017-10-23 06:34:07 +08:00
    @noli 还特地每个都喊一声 我要拉黑, 笑尿。联想起 lol 里面的德玛西亚。
    jetyang
        29
    jetyang  
       2017-10-23 09:23:07 +08:00
    我觉得大家关注点偏了。unicode7.0 标准里 17 个面现在用了多少?是不是要大规模的去扩充 codepoint 空间?变长编码和定长编码相比有什么好处?

    UTF-8 的编码思路并非只用在字符编码上,一些压缩算法也是一样的思路,楼主加油
    iceheart
        30
    iceheart  
       2017-10-23 19:29:08 +08:00 via Android
    UTF-8 ( 8-bit Unicode Transformation Format )
    UTF-16 ( 16-bit Unicode Transformation Format )
    先把概念搞清楚再讨论问题。
    当然,这个问题的概念搞清楚了,问题也就没必要讨论了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1104 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 23:30 · PVG 07:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.