操作系统的设计中,编码是”热插拔“的吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nowheretoseek
V2EX    问与答

操作系统的设计中,编码是”热插拔“的吗?

  •  
  •   nowheretoseek 2021-08-17 23:03:16 +08:00 2181 次点击
    这是一个创建于 1547 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是不是说操作系统完全建构于 ASCII ( 0-127 )之上,然后对其它语言的支持是“可增减”的?

    比如说,如果某天发生了星外文明的接触,人类了解了他们的语言,需要处理他们的文本。是不是设计一套类似 unicode 的字符编码方案和相应的字体,安装到操作系统中,就可以用人类的计算机处理他们的信息了,而不必对目前的计算机、操作系统做底层的更改?

    一些底层没有 Unicode 支持的编程语言,比如 python2 是不是在应对这样的需求时,反而更加灵活?

    23 条回复    2021-08-19 08:54:36 +08:00
    iotwd
        1
    iotwd  
       2021-08-17 23:07:09 +08:00 via iPhone
    万物基于 0 、1 (阴和阳)
    ayase252
        2
    ayase252  
       2021-08-17 23:20:33 +08:00
    操作系统与编码无关

    编码与解码只是二进制与字符的一种人为规定的双向映射。现在计算机里就有很多不同的编码,如 SHIFT JIS,BIG5 等等,完全是可以和谐共处的。
    bitdepth
        3
    bitdepth  
       2021-08-17 23:26:57 +08:00 via iPad
    在 linux 中 utf-8 是由 libc 提供支援的,建重修 C language
    cmdOptionKana
        4
    cmdOptionKana  
       2021-08-17 23:29:33 +08:00
    在 Unicode 普及之前,Windows 系统提供处理不同语言的版本,比如中文版、日文版。根据这个思路,大不了再提供一个外星文版即可。

    不同语言版本,主要是对 GUI 界面语言做特殊处理而已,不影响底层。实际上,有些软件的菜单可以做语言的“热切换”,操作系统想做也能做到。或者某个区域指定一种语言,另一个区域指定另一种语言,也能做到(比如参考 HTML 指定语言的方式)。
    wanguorui123
        5
    wanguorui123  
       2021-08-17 23:47:03 +08:00
    Unicode 有非 BMP 字符,这是可以自定义的
    ipwx
        6
    ipwx  
       2021-08-17 23:49:07 +08:00
    嘈点太多以至于无力吐槽
    nowheretoseek
        7
    nowheretoseek  
    OP
       2021-08-18 00:07:23 +08:00
    谢谢,理解认同大家的意思,因为知识有限,我对一些概念的理解和表述可能存在层次混乱什么的,重新提一下问题:
    我的主要想法是计算机世界的现状是 Unicode 有巨大影响力,一些编程语言有底层的 Unicode 支持,操作系统层面会不会也有为了适应它而做的耦合?毕竟好像暂时不用考虑新的类似 Unicode 的编码方案。当然如果出现了新的语言,而 Unicode 可以轻松将其纳入自己的编码体系中,就不是这个层面的问题。
    一些轻量的 Linux 环境,默认只有 en 语言支持,要显示、接受输入其它语言,就用 locale-gen 添加,这些支持当然也是通过特定库、模块实现的。而似乎无法想象没有 en ( ASCII )支持的操作系统。
    那么如果现在有这么个需求,要用计算机处理一个字符量很大的新文明语言,比如字符量是 CJK 的总和还多些,那么是否可以比较容易、低成本的实现一个新的 Unicode2,并将其在 windows 、linux 等操作系统上跑起来?
    @nowheretoseek @iotwd @ayase252 @bitdepth @cmdOptionKana @wanguorui123 @ipwx
    cmdOptionKana
        8
    cmdOptionKana  
       2021-08-18 00:37:18 +08:00
    @nowheretoseek 你似乎认为包含外星文的 New Unicode 与目前的普通 Unicode 有本质区别,或者成本(消耗计算资源)会高很多?

    但事实是,包含外星文的 New Unicode 与目前的普通 Unicode 没有本质区别,消耗的计算资源也可以忽略不记。

    因此,只要把 New Unicode 做出来,让 Windows 、Linux 支持它是非常轻松的。(而制作 New Unicode 则主要是体力活,与编程、计算的关系不是很大)
    ipwx
        9
    ipwx  
       2021-08-18 00:40:33 +08:00
    @nowheretoseek

    0. 首先楼主要明白一点:字符编码只是一种把文本变成二进制串再变回来的规范。字符串本质都是二进制串。不同的编码能产生不同的二进制串,但是都是二进制串。

    这里吐槽一下,这就是没有在 C/C++ 里面摸爬滚打过的坏处了。char* 数组、'\0' 结束符,有这些基础来解释二进制字符串就很容易理解。不然都是从 Java/C#/Python3 学起的,我 tm 根本不知道怎么解释这个常识。

    1. 据我所知,Linux 大部分系统核心功能没考虑啥编码的事情。包括文件系统在内都是直接操作二进制串的。像 ext4 这种文件系统,似乎你可以把任何二进制串当做文件名,甚至是不合法的乱码二进制串(反正它不在意,它只在意这个二进制字符串)。

    2. 有些文件系统似乎会考虑编码,比如 APFS,NTFS 。

    3. Unicode 只是个字符映射表,它的规范是字符 <=> 数字的映射关系。具体怎么变成二进制串有很多种方法

    3.1 UTF-8:一个 Unicode 字符被映射成 1~6 个二进制 8 位数字不等。建议楼主学习一下这个编码方法,因为它可以直接解答楼主的帖子里面的所有问题。理论上这种编码方法可以类推到任何长度的可变长字符,比如 1~100 个二进制 8 位数字。

    3.2 UTF-16:一个 Unicode 字符被映射城 2 个或 4 个二进制 8 位数字。这个方案应该也能直接类推成任意 2K 个字符。建议楼主学习。也可以解决楼主的所有疑问。

    3.3 UCS-2:早期最多能表示几万个字符的 Unicode 编码方案,每个字符固定映射城 2 个二进制 8 位数字。在更小的字符集上和 UTF-16 相同。可能很多人第一反应的 Unicode 就是这种编码方案,但是实际上不应该用这个编码处理很多事情,会造成字符截断问题。

    3.4 UCS-4:每个字符固定映射城 4 个二进制 8 位数字。对于地球字符而言这已经足够了。Python3 用的是这个编码。

    4. 所以楼主的问题实在是无力吐槽,因为 UTF-8/UTF-16 已经满足楼主的问题了。
    msg7086
        10
    msg7086  
       2021-08-18 02:20:46 +08:00
    大多数场景下程序只需要关注 byte[],不需要关注字符串。
    byte[]到字符串的映射是可以修改和增加的。
    外星文的文字和少数民族的文字有什么本质上的区别吗?
    泰文,阿拉伯语,泰米尔语,等等各种各样的文字不都能够表示了吗?
    你把外星人当作一个新的少数民族就行了。
    binux
        11
    binux  
       2021-08-18 02:28:29 +08:00 via Android
    推荐一本书《计算机文化》它对很多计算机基本的知识做了浅显的解释。
    nowheretoseek
        12
    nowheretoseek  
    OP
       2021-08-18 10:00:03 +08:00
    谢谢各位,你们说的知识点和思路我大致都了解些,我想问的其实是目前操作系统的设计中 Unicode 的耦合度,是完全可插拔的,还是说底层上有相当程度的耦合。之所以假设外星文明语言,如前说为了符合字符量很大(超过 CJK 总量)这样一个假设,使其无法放到现在的 Unicode 集合中,只能搞一个 New Unicode 。(这跟将一个少数民族的文字放入当前的 Unicode 体系中有些区别)
    所以,再次这么表述下问题:如果有上述需求,是不是做些体力活设计出这个 New Unicode 以及相应的字体,就可以几乎无成本的显示、处理这些新的语言文字了?(几乎无成本是说做些配置或修改少数一点代码什么的)@ipwx 提到的有些文件系统会考虑编码是我想知道而之前不知道的情形之一。
    @ipwx @msg7086 @binux @cmdOptionKana
    wutiantong
        13
    wutiantong  
       2021-08-18 10:29:24 +08:00
    @nowheretoseek 当问题包含太多假设时,实际上,你自身的知识储备成为了唯一的瓶颈。与其在这里靠想象不断发散,为何不花点时间去学习掌握实际的知识呢?毕竟 unicode 又不是什么黑箱的东西。
    ipwx
        14
    ipwx  
       2021-08-18 10:31:15 +08:00   2
    我 tm 真不知道楼主在一本正经地纠结什么。
    ----

    都说了 Unicode 本质是字符 <=> 数字,你增加字符不就是在码表中继续加字符么?本来就没有 New Unicode,因为每过几年 Unicode 就会发布新的码表,因为增加修订了什么东西。你可以说每一版都是 New Unicode 。

    再说一遍 Unicode 是字符 <=> 数字,tm 根本就没规定是 32 位整数。地球文字只有十万多字符,你 20 亿还不够外星文明用,那就用 64 位整数吧(摔)
    ----

    再说编码。UTF-8 的规则几乎可以无限扩展单字符长度。在大部分程序看来都是直接用库解析这坨二进制,比如 libICU 。或者干脆不理这坨东西到底是什么,因为 UTF-8 的编码方式保证了它具有替换安全性(你把它当成二进制 char[] 替换一个合法的子串,不会产生非法的串)。替换、分割、合并,所有这些普通字符串操作都是安全的。这意味着 regex 也是安全的,以及所有一般的字符串算法都是安全的。这 tm 还能有什么问题?

    所以为啥用 UTF-8 替代 GBK 这种字符集?因为 GBK 没有局部替换的安全性。
    ipwx
        15
    ipwx  
       2021-08-18 10:32:05 +08:00
    13L 说得对。 对 @nowheretoseek 楼主无力吐槽的主要原因是,tm 一堆根本就不对头的假设,然后推出了让人摸不着头脑的结论。
    halfdb
        16
    halfdb  
       2021-08-18 12:52:02 +08:00 via Android   1
    我来试着改编一下问题,不知道能不能表达楼主真正想了解的问题。
    假设某个国家自主研发了一套 New Unicode 并要求所有设备都必须使用 New Unicode,那么为了让 Linux 、Windows 、macOS 在这个国家能被合法使用,需要做多大的改动呢?
    binux
        17
    binux  
       2021-08-18 13:02:05 +08:00 via Android
    @halfdb 你说的这个情况也不符合实际,即使有 new Unicode,那么只要要求操作系统“支持” new Unicode 就好了,“必须使用”的意义在哪?
    nowheretoseek
        18
    nowheretoseek  
    OP
       2021-08-18 14:45:35 +08:00
    @halfdb 是这么个意思,表达很清楚。
    nowheretoseek
        19
    nowheretoseek  
    OP
       2021-08-18 14:49:45 +08:00
    @ipwx 只是设问,我也知道涉及的概念在不同层面上,而我很可能混用了他们。的确基本只是在字符串的角度考虑问题,不大能从 int 、byte 、char 、char[]的角度理解,这是个硬伤。
    aneostart173
        20
    aneostart173  
       2021-08-18 16:18:00 +08:00
    内核不需要改动,应用看情况,如果大部分应用都遵守公共的约定,那么需要改动的很少。
    msg7086
        21
    msg7086  
       2021-08-18 19:46:39 +08:00 via Android   1
    Unicode 一直在被 new 。最后一个版本是 Unicode 13.0,正在做的草案是 14.0,如果有外星文字出现的话,做个 15.0 就行了,问题解决。Unicode 的容量可以说是无限的。

    Unicode 可以看作是文字的索引。比如字母 A 的号码是 65,比如火星文里某个字的号码是 114514,假如某个外星文字有一亿个不同的字符,那就给他们编一亿个编号。新版本的 Unicode 就是给更多的字编号,给他们一个“名分”。

    然后这个数字怎么保存在文件里或者内存里,这个就是用到编码转换,比如你把 65 保存成 00 00 00 41 这就是一种表示方法。如果有朝一日不够用了,就扩展成能表示更多号码的格式,比如 8 字节,16 字节长度等等。这个过程本来在这十几年里就一直在发生着,越来越多的少数用户语言被加入到 Unicode 中。外星语言只不过是另一种待加入的普通语言罢了。
    nowheretoseek
        22
    nowheretoseek  
    OP
       2021-08-18 21:30:07 +08:00
    @msg7086 了解关键了,结合 @ipwx 对 utf-8 的强调,可以这么理解吧?可无限扩展的 Unicode+8 位为基本单元的可变长度的 utf-8,足以适应未来可预见的扩展需求,并保证存储效率和后向兼容性。
    msg7086
        23
    msg7086  
       2021-08-19 08:54:36 +08:00
    @nowheretoseek 是的。现在的 UTF-8 如果再扩展的话,最多可以表示 1 亿以上的数据点。
    如果实际需求更大的话,那就再发明新的编码方式就行了。
    世界从当年的本地字符集过渡到 Unicode 也就花了几年十几年的时间,在人类发展历史中基本都是小问题。
    (光从 IPv4 到 IPv6 要过渡多少年想想就蛋疼……)
    现代化的计算机系统里,这些东西都是尽可能模块化的,就算要彻底替换,也不是特别困难的事情。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3008 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 12:34 PVG 20:34 LAX 04:34 JFK 07:34
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86