jarlyyn 发表于 2024-8-6 16:25:32

杰哥瞎扯淡之戏说编码

本帖最后由 jarlyyn 于 2024-8-6 04:30 PM 编辑

喜欢拿啥是比呀装逼的,都喜欢来一句To be or not to be。
每个北侠用户上线,也会有个选择,gbk or utf8。

这个gbk和utf8倒底怎么回事,读者可能不懂。不懂那就太棒了,且听杰哥吹牛逼。

什么是字符串。

字符串是个看起来很简单的问题,用引号包起来的就是字符串么,代表几个文字,对吧?

真没那么简单。

比如知乎有个热门问题,“为什么大多数的 C++ 的开源库都喜欢自己实现 string?”https://www.zhihu.com/question/54664311/answer/3477330135

jarlyyn 发表于 2024-8-6 16:26:04

本帖最后由 jarlyyn 于 2024-8-6 04:31 PM 编辑

美国标准
让我们先从盘古开天辟地吹起。

所谓的字符串,理论上来说,对应了代表文字一连串内存数据。

现在的计算机大体上是以字节做为最小的数据储存单位,一个字节有8位2进制值,代表0-255的数字,正好可以用2位16进制的数字表示。

也就是,所谓的字符串,理论上,大概是这样的形状

"FF FE 41 42 43 44"

那么问题来了,怎么规定一个大家都能接受的数字和字母的对应关系呢?

众所周知,计算机技术起源于美国,所以,美标来了

由于美国人一般只使用大小写英文和数字,以及几个少数的符号,远远不到256个,所以懒懒的美国人就用一个字节对应一个字符,做了一个

美国信息交换标准代码,American Standard Code for Information Interchange,也就是我们常用的ASCII。

在这个标准里,只有英文,没有中文,没有日文,没有德语俄语之类。而且由于内容实在太少,甚至只使用了里面的一半。


jarlyyn 发表于 2024-8-6 16:26:50

本帖最后由 jarlyyn 于 2024-8-6 04:32 PM 编辑

群雄逐鹿
随着计算机技术的普及,越来越多国家开始普及和使用计算机。很明显,对于大部分国家,特别是使用大量象形文字的中日韩东亚文化(在字体领域一半称为CJK),红脖子的美标明显不够用了。

在这种情况下,不同文化背景的国家和地区当然会使用自己的标码标准。

前面说到,美国佬还算有点良心,只用到了字节的一般。所以很明显的方案,就是小于等于127的字节当作英文数字处理,大于等于127的,和后一个字节并在一起,扩展成2位,拿就能表达128+128*256,一共32768个字符。

这就叫作ANSI编码

https://baike.baidu.com/item/ANSI/10401940

在当时看来,哪怕最复杂的文字也放的下了。

美国有美标,我大中华自然也有国标。

众所周知,我国的国标以GB或GB/T和GB/Z开头。

GB开头为强制国家标准,GB/T开头大表国家推荐标准,GB/Z开头为国家指导性技术文件。

https://www.sac.gov.cn/jdbnhbz/bzgs/art/2021/art_14323dcf3c104735b6f3096facdc3bdf.html


在ANSI时代。我国发布过很多标准,依次为。

1980-GB/T 2312-1980 这就是大家常说的gb2312,在2017年之后,gb2312转为推荐型标准,所以是GB/T,这个标准可以说地位相当于仓硕造字,是计算机中文化的源头,历史意义十分巨大。

这个标准一共收入了6763个字符。网络上大部分常见的中文字体涵盖的数量也差不多是这个数字。

参考《通用规范汉字表》

一级字表(常用字集)3500个,二级字表3000个,三级字表1605个。一、二级字表主要满足出版印刷、辞书编纂和信息处理等方面的一般用字需要;由姓氏人名、地名、科技术语和中小学教材常见文言文用字构成的三级字表则主要满足与大众生活密切相关的专门领域的用字需要。

https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E8%A7%84%E8%8C%83%E6%B1%89%E5%AD%97%E8%A1%A8

可见日常的工作生活,基本GB2312能大体满足了。

1995年制定的GBK,汉字内码扩展规范,

这个编码,向下兼容gb2312,同时支持了 ISO 10646.1国际标准。

在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字

https://baike.baidu.com/item/GBK%E5%AD%97%E5%BA%93/3910360?fr=ge_ala

专业化,国际化,涵盖了整个CJK区的字符,确保混合多国语言的文字能正常编码,至少在当时可以说是符合国际先进潮流的。


jarlyyn 发表于 2024-8-6 16:27:22

本帖最后由 jarlyyn 于 2024-8-6 04:32 PM 编辑

全球化时代

随着人们把越来越多的字符融入编码体系后,字符数量迎来了有一次的暴涨,2字节的长度已经不能保证容纳所有的字符了,所以新的编码需求出现了,一个文字可能是1,2,4位字节。

GB18030就是适应这个潮流出现的标准

GB18030有三个版本

GB18030-2000,GB18030-2005,GB18030-2022。

目前GB18030-2022是最新的强制性国家标准,于2023年8月1日后生效。

中国市场上发布的应用软件从法律上必须支持对应的GB18030版本

譬如微软的Windows,也在2023年6月和7月发布操作系统更新,确保符合国家标准。

https://www.dell.com/support/kbdoc/zh-cn/000216478/gb18030-2022-chinese-code-character-set-requirement


jarlyyn 发表于 2024-8-6 16:28:00

本帖最后由 jarlyyn 于 2024-8-6 04:33 PM 编辑

UNICODE?UTF8?UFT16?
在计算机领域,

unicode(统一码)是一个在计算机领域使用非常广泛的编码。

在1991年,统一码联盟成立,并发布了第一版Unicode Standard 1.0。0。1992年,也就是gb2313发布12年后,GBK发布3年前,加入CJK东亚文字支持,1993年发布1.1版

https://en.wikipedia.org/wiki/Unicode

由于统一码联盟的创建者基本是计算机领域中的龙头企业( Adobe, Apple, the Bangladesh Computer Council, Emojipedia, Facebook, Google, IBM, Microsoft, the Omani Ministry of Endowments and Religious Affairs, Monotype Imaging, Netflix, Salesforce, SAP SE, Tamil Virtual Academy, and the University of California, Berkeley)

所以再计算机领域的使用十分广泛。

对于unicode和gb18030之间的法律关系,根据unicode官网链接https://www.unicode.org/L2/L2001/01314-FAQ-GB18030.htm

程序可以在内码使用unicode,只要在输入输出时进行GB18030的转换,也能符合中国的国家标准。

另外,UTF8是一种unicde编码,但unicode不止是utf8。uncide主要有utf8,utf16,utf32 3个版本。

utf8:变长版本的unicode编码,主打每个字符长度不定。

utf16:虽然16看起来比8大,但实际上,utf16是UCS-2的扩展,在unicode初期大家觉得两个byte足以表示所有字符了,结果随着不停扩张发现不够了,只能再扩展,结果从定长边为变长,优势尽失,被unicode坑惨了。参考 https://www.zhihu.com/question/308677093/answer/3449042327

utf32:四字节定长。怎么说呢,看着utf16的经验和unicode的放飞自我的现状,早晚成为下一个utf16。

所以,看一个开发语言的编码格式,甚至能大体看出这个语言新不新

utf 8:golang ,python3

utf 16:java,javascript

ansi:c ,lua

对于unicode本身来说,一路上还是有不少小坑的,比如utf-16,比如mysql的utf8和utf8-mb4


jarlyyn 发表于 2024-8-6 16:28:32

本帖最后由 jarlyyn 于 2024-8-6 04:33 PM 编辑

关于emoji


emoji这个东西,就是把uncode不当作文字,而是当作符号来使用。

说真的,我感觉这开了个很恶劣的先河。甚至使得unicode失去了他原本的意义。

很简单,文字的本意还是用来显示的。各国的文字,哪怕再坑,总有一个标准。

而emoji是一个历史上和现实不存在的东西,显示完全取决于字体,ios,android,windows,linux下的emoji都长的不一样。

而且不同字体对于emoji的实现度都不一样。这是个大坑。

个人感觉,emoji再这样无限扩充下去,早晚会分离出带emoji的编码空间和不带emoji 的编码空间。

emoji还有很多特点,比如有肤色修饰符,人脸之类可以根据不同的肤色显示为不同人种。

比如有组合功能,可以把2男2女的emoji组合成 爸爸、妈妈和儿女一家 的emoji,一长串文字显示出来只有1格。


https://ecnelises.com/2024/05/utf-emoji-ligatures/

我只能说,那怕我自己的客户端,由于不是专门用来渲染的,对于emoji的支持也只能说随缘。

如果是emoji爱好者,不妨多研究研究emoji这些特性,自己是否支持的很好,免得陷入叶公号龙的窘境。

其实大部分网站和游戏,应用,对于emoji还是随缘为主。

内容不限制,能正常显示就正常显示,不能正常显示拉倒。昵称ID这类会限制的很死。


jarlyyn 发表于 2024-8-6 16:29:06

本帖最后由 jarlyyn 于 2024-8-6 04:34 PM 编辑

关于Unicode的其他问题

首先,在纯中文领域,unicode最大的吐槽点是重复,同一个字的字形会有多次重复,日本韩文中的中文也经常和中文的同一个汉字有不同的编码

https://www.zhihu.com/question/320709601

以至于从个人角度来看,使用范围内的编码,是由字体能显示什么字符决定,而不是unicode本身的范围决定。

其次,强调使用unicode一般多少会和i18n(Internationalization)有关系。但渲染是一个很复杂的事情,很多东西不是汉语使用者能想想到的,就像英文使用者想不到汉语的很多问题一样。

比如,渲染届的大难题,阿拉伯文。

阿拉伯文不光是从左向右的,还有连笔问题

https://www.zhihu.com/question/23271046/answer/2627898914

比如,日文汉字上常见的标注,ruby,unicode里也有实现

https://www.zhihu.com/question/662828394/answer/3584599113

说真的,除了微软,Apple这种大厂,真的能号称搞定,玩转unicode的,我心理多少打个折扣。


jarlyyn 发表于 2024-8-6 16:29:37

本帖最后由 jarlyyn 于 2024-8-6 04:35 PM 编辑

关于mush
其实北侠说编码,绕来绕去就是mush。

mushclient作为一款历史非常有就的外国人制作的客户端,其实压根不支持更多外文(注意,实际爬mush代码会发现为中文加修正的备注,感恩)

mush就是根据系统的编码来的。

你的系统是unicode,mush就是unicode(注意,windows历史有就,也属于被unicode坑过的utf-16党)

你的系统是gb18030,mush就是gb18030(所以mush可以连gbk,虽然作者可能都没用过中文系统)

当然,不管怎么设置,mush都不支持emoji的。

emoji这玩意太复杂了,对于需要需要模拟终端进行渲染的Mud客户端来说要求太高了。就连Windows自带的cmd和powershell,复制emoji进去都会显示乱码。

对于mush,能正常在中文mud下运行和正常显示(比如隔壁某客户端中文都不能粗体),只能说感恩,感谢,不能要求太多。

harrychencyh 发表于 2024-8-6 16:30:23

本帖最后由 harrychencyh 于 2024-8-6 04:48 PM 编辑

其实杰哥讲的大部分中学教材里是有的,不过杰哥说的很生动,顺序和思路也很清楚(我可能得特指沪教版,其它版不一定有)

jinger 发表于 2024-8-6 16:30:44

杰哥说的好 啊
页: [1] 2
查看完整版本: 杰哥瞎扯淡之戏说编码