世界看点:我对编码的理解
在我之前的编程生涯中,总是对一些关键概念糊里糊涂不求甚解,比如进程、线程,比如堆、栈、编码。我对这很
在我之前的编程生涯中,总是对一些关键概念糊里糊涂不求甚解,比如进程、线程,比如堆、栈、编码。我对这很多概念的理解,都来自于各式样的博客。
最近几年看书多些,了解到最好的学习方式是将获得的知识以自己熟悉的模式进行整理(那许多的博客,是他人对自己知识的整理;当然,有一些文章,是将知识融会贯通后发明的“新招式”),于是逼着自己一个月整理一篇技术博客。
最近正阅读的技术书籍有Effective Python、《编码》,它们都提到编码、字符集、ASCII、Unicode、UTF-8、str、bytes……等相关关键字。
(资料图片仅供参考)
在我理解“编码”时,再一次地产生晦涩感,于是4月的技术整理,是“我对编码的理解”。(我承认五一假期一直在玩耍,这篇文章,该在上周就整理完毕的。)
这个世界,是先有文字然后才有计算机的。所以计算机展示文字(以“嘟”字举例)的方式,简单点说,可以是:将一张“嘟”字的图片放到屏幕上展示。
这句话可以拆成两个问题:
如何拿到图片?
如何在屏幕上展示图片?
“如何在屏幕上展示图片”并非理解编码的重点,我只提供两个思考方向:
一是在《编码》中看到的。视频适配板有一个字符生成器(character generator),在生产时就包含了所有的ASCII码字符的8x8像素图。每当需要展示字符(以“A”举例)时,先找到“A”的ASCII码0x41
,再通过0x41
找到存储在字符生成器中的像素图,再依据像素图将对应位置的像素点进行点亮。
二是来自OpenGL学习文档中的FreeType:使用矢量图像构造字形。大家感兴趣可以查看后面的引用链接。(该文档中“位图字体”与《编码》中思想一致,都是直接展示图片。)
本篇文章的重点是如何拿到图片?
如何拿到图片呢?
为回答这个问题,我们首先得知道“图片”是什么?
如上所说,图片是“文字”,是人类用来纪录特定事物、简化图像而成的书写符号(后文称“书写符号”为“字符”)。
全球有近200个国家,约6000种语言,人类主要使用的文字种类有:语素文字、音节文字、拼音文字等。其中以英语、汉语、印地语、西班牙语、法语、阿拉伯语、孟加拉语……等使用人数最多。
按照我从网上搜到的统计数字:全世界所有的字符数量是超过10万个的。
如果计算机需要将这10万多个字符都展示出来,则相应的需要10万多张图片?
这些图片如何管理,字符“A”是排在字符“嘟”前面还是后面?中文、英文、法语、俄语甚至日语需要放在一起么?我是中国人,看不懂也用不上俄语,需要去设置去关心俄语图片么?
计算机起源于美国,最初的科学家确实是只关注英文的,于是设定了ASCII(American Standard Code for Information Interchange)标准——26个字母、阿拉伯数字,再加上些标点符号,够了!
随着计算机向全球普及,ASCII收录的字符显然是不够用的,于是各个国家出台自己的标准——比如Shift-JIS(日本工业标准)、GB2312(中国标准简体中文字符集)等——来表示本国的文字。
同一事物的标准越多,则代表没有标准;多标准一起存在,乱码处处可见。
为了统一标准,1988年,几大著名计算机公司合作研究出一种用来替代ASCII码的编码系统,取名为Unicode(统一化字符编码标准),它采用16位编码,每一个字符需要2个字节,可以表示65535个不同字符。全世界所有的人类语言,都使用同一个编码标准。(后来,Unicode再次扩容,分为17个面,即一共可以表示17 * 65535 = 1114095
个字符。一般情况下只需要0号平面就够了。)
到此处,则可以回答节首的问题:如何拿到图片呢?
从Unicode中拿!
Unicode是什么呢?
Unicode是字符集,是一种标准,是收录全世界字符图片并为之配上一个编号的标准。比如字符“A”的编号是0x41
,“嘟”的编号为0x561F
(本文的编号,都是16进制)。
如上所说,现在我们知道了文字字符,是一个编号对应一张图片,这所有的对应关系合在一起成为了Unicode字符集。
在计算机在进行数据传输与存储时,为了节省空间,是只会传输和存储字符编号的。
如何存这个编号?是我们需要关注的重点。
对ASCII码来说,一个字符,一个字节就够了,挨着存就好:比如Hello
的存储形式为48 65 6C 6F 2C
。
当标准切换为Unicode时,一个字符的编号需要两个字节长度来存储,以Hello
加个嘟嘟
举例,它的存储形式将变成00 48 00 65 00 6C 00 6F 00 2C 00 20 56 1F 56 1F
(空格字符的编号为0x20
)。
我们可以看到,中间是有很多空间被浪费的,很多的00
不需要被存下来。
为了去掉这些额外空间,大佬们又为Unicode编码发明了UTF-8(8-bit Unicode Transformation Format)
,一种针对Unicode的可变长度字符编码。
具体的UTF-8规则此文不再阐述,我只在Python3中向大家展示一下如何将UTF-8编码转回Unicode编号:
# 1. 原字符串>>> s = 'Hello 嘟嘟'# 2. 将其以UTF-8格式进行编码(encode函数,默认参数是utf-8)>>> b = s.encode()>>> bb'Hello \xe5\x98\x9f\xe5\x98\x9f'# 3. 将编码出来的bytes对象以16进制展示>>> b.hex()'48656c6c6f20e5989fe5989f'# 4. 将“嘟”字的UTF-8码以二进制形式展示出来>>> dudu = '嘟'>>> [bin(byte) for byte in bytes(dudu, 'utf-8')]['0b11100101', '0b10011000', '0b10011111']
可以看到,上面实例第3点,当将Hello 嘟嘟
的UTF-8展示形式以16进制展示出来时,是没有额外存储0x00
的。
末尾“嘟”的UTF-8存储形式为e5989f
,在我将其以二进制形式展示出来后,套入UTF-8的规则进行逆解。
由上面的表格可以看到,只需要将第1个字节的后4位0101
、第2个字节的后6位011000
、第3个字节的后6位011111
进行拼接,即能得到Unicode的编码,见证奇迹的时刻到了……
拼接之后的二进制码为:
# 1. 将拼接好的二进制码赋值给int>>> b1 = int('01010110', 2)>>> b2 = int('00011111', 2)# 2. 将int转成16进制展示>>> hex(b1)'0x56'>>> hex(b2)'0x1f
可以看到,将“嘟”字转回为Unicode编号之后,与我们查表得来的0x561F
是一致的。
所以,UTF-8是什么呢?UTF-8只是一种存储Unicode编号的方式。
综上所述,我算是对与文字相关联的那些关键字——字符集、ASCII、Unicode、UTF-8、str、bytes——有些了解了。
文字是什么?文字是一张张图片,是人类用来纪录特定事物、简化图像而成的书写符号。
字符集是什么?字符集是一种标准,一种规范,一种协议,一种整理统计文字图片及图片所对应编号的一种集合。ASCII、Unicode、GBK等都是字符集。
UTF-8是什么?是存储Unicode字符集里面文字编号的一种字节编排方式。
str、bytes是什么?是Python3中的两种类型,可以很笼统地将str与Unicode对应,将bytes与UTF-8对应。
GBK,国家标准扩展。在Python3里面可以直接以gbk
形式对str对象进行编码,这理解起来会简单些:
# 将str以gbk编码转为bytes>>> s = 'Hello 嘟嘟'>>> s.encode('gbk')b'Hello \xe0\xbd\xe0\xbd'
可以看到“嘟”字的存储形式为0xE0BD
,占用2个字节,看下方截图,直接就找到映射关系了。
下面链接中“%”符号后面跟着的两个字符,也是Unicode编号以UTF-8形式进行编码的。可以按照上面的逆解方式验证。
1、Unicode码表:https://zh.wikipedia.org/wiki/Unicode%E5%AD%97%E7%AC%A6%E5%88%97%E8%A1%A8(解出来的中文是“字符列表”)
2、GBK码表:https://toolhelper.cn/Encoding/GBK
3、OpenGL的文字渲染:https://learnopengl-cn.readthedocs.io/zh/latest/06%20In%20Practice/02%20Text%20Rendering/
4、文字分类:https://zh.wikipedia.org/wiki/%E6%96%87%E5%AD%97
5、UTF-8的编码方式:https://zh.wikipedia.org/wiki/UTF-8#UTF-8%E7%9A%84%E7%B7%A8%E7%A2%BC%E6%96%B9%E5%BC%8F
关键词:
在我之前的编程生涯中,总是对一些关键概念糊里糊涂不求甚解,比如进程、线程,比如堆、栈、编码。我对这很
1、喜欢一个人,并不一定要爱她(他);但爱一个人的前提,却是一定要喜欢她(他)。2、喜欢很容易转变为爱
今天来聊聊关于天下黄河九十九道弯简谱简谱,天下黄河九十九道弯简谱的文章,现在就为大家来简单介绍下天下
据交管部门介绍,在涉及儿童的交通安全事故中,由于“监护人监管不力”导致的,占到总数的68 9%。交警在执
今天,“同行:版画的研究与探索——英格里德·勒登特、卢治平双个展”在中华艺术宫0米层15、16展厅开幕。
上古卷轴五天际重制版mod,上古卷轴5天际重制版mod怎么用这个很多人还不知道,现在让我们一起来看看吧!1、
德班世乒赛女单决赛对阵出炉,孙颖莎大战陈梦,这是东京奥运会女单决赛的重演。陈梦晋级决赛非常不容易,她
格隆汇5月28日丨岳阳林纸600963600963SH公布公司拟使用自有资金采用集中竞价交易的方式从二级市场回购公司
本文内容是由小编为大家搜集关于股票000761,以及股票000519的资料,整理后发布的内容,让我们赶快一起来看
我经常很难选择我最喜欢的甜点。它是经典的苹果派吗?酥脆的外皮和热乎乎的苹果从两层之间翻滚?也许它是苹
正所谓见字如面。朴树,清流,再一次实锤了!别人家的热门——我们离了,我们没离,123上链接。又或者是—
在马龙即将面临退役的阶段,王楚钦的崛起无疑为国乒男队增加了双保险,樊振东也迎来了自己的左膀右臂。马龙
银行代销,合规风险暴露,基金,风控,代销
全国麦收进度达7 9%各地全力做好抢收保障
连日高温抵挡不住海口江东新区建设者的步伐。当前,在海口江东新区多个项目施工现场,施工人员抢抓施工黄金
用果肉冷藏法,因已经打开但果肉没有熟透的榴莲。可将果肉从榴莲壳中剥出来,用保鲜膜严密的封紧裹住,放在
固然在虎年里会遭受太岁无刑克之害,但受吉星的影响比拟大,所以各方面运势表现不一样。在事业方面,受吉星
[本站资讯]全新凯迪拉克CT6、全新产品凯迪拉克GT4、新款凯迪拉克XT4车型将于今日(5月28日)晚间正式上市,
现代快报网是由凤凰出版传媒集团旗下的现代快报倾力打造的江苏新闻门户网站,目前在南京、苏州、无锡、常州
1、互联网上查不到营业执照副本编号,需要带上正本到登记注册地工商局,工商局内网是可以查到的。2、营业执
1 8万个岗位!京津冀三地携手促就业助力高校毕业生求职
《马虎王子与精明公主》是一部当代儿童文学作家创作的童话,2018年9月由天津人民出版社出版,作者张一成。
1、属于河南省周口市。2、是周口唯一一个县级市。3、也是河南省6个扩权县之一。本文到此分享完毕,希望对大
(庞喻文)27日上午,天津市民政局与天津理工大学共同举办的天津市“五社联动”高层次社会工作人才培养
坟头蹦迪是什么梗,坟头蹦迪的出处很多人还不知道,现在让我们一起来看看吧!1、灵车漂流,盗墓之类的词都
Copyright 2015-2022 西方酒业网 版权所有 备案号:沪ICP备2020036824号-7 联系邮箱:5 626 629 @qq.com