暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

02. 编码

幼麟实验室 2020-06-21
349



电报之父塞缪尔·摩尔斯(Samuel Finley Breese Morse,1791年4月27日-1872年4月2日)是一名享有盛誉的美国画家。1837年发明了电报机,1839年发布了电报使用的编码:“摩尔斯”码。1844年5月24日华盛顿和马里兰州巴尔的摩之间的电报线成功地传送了圣经上的一句话“ What hath God wrought!”,这是人类历史上的第一份电报。




01


电报机






在铁棒外缠绕几百圈细导线就做成了一个电磁铁,电磁铁通电时会产生磁力,拖动上方的铁片敲击下边缘发出“嘀”的声音,断电时铁片恢复初始位置并敲击上边缘发出“嗒”的声音。因此这整个装置就叫做“发声器”。将其输入端连接到一个控制电源的按键开关装置,就组成了一个老旧的电报机。


VV按键未按下时,电磁铁未通电,铁片处于水平位置。按下按键时,电磁铁通电产生磁力,吸引铁片向下转动。输出输出发送端接收端


最初电报机的接收端是通过电磁铁控制一支笔和一卷匀速穿行的纸带,当按键按下时笔会接触纸带,如果按键快速按下,会在纸带上留下点“·”,而缓慢按下时则会在纸带上留下划“-”的痕迹。通过一条写有点和划的纸带可以传达什么信息? 



······-





02


摩尔斯编码





C???-·-·----···


摩尔斯编码表(部分)

字符编码字符编码字符编码字符编码
A·-I··Q--·-Y-·--
B-···J·---R·-·Z--··
C-·-·K-·-S···0-----
D-··L·-··T-1·----
E·M--U··-2··---
F··-·NV···-3···--
G--·O---W·--4····-
H····P·--·X-··-5·····



-·-·----·快速按键缓慢按键间隔较长时间间隔较短时间将符号编码成点和划的组合,加上两种间隔,这样就可以通过“电”来传输语言信息了!




03


编码汉字




ASCII编码(部分)
字符编码字符编码
A0100 0001N0100 1110
B0100 0010O0100 1111
C0100 0011P0101 0000
D0100 0100Q0101 0001
E0100 0101R0101 0010
F0100 0110S0101 0011
G0100 0111T0101 0100
H0100 1000U0101 0101
I0100 1001V0101 0110
J0100 1010W0101 0111
K0100 1011X0101 1000
L0100 1100Y0101 1001
M0100 1101Z0101 1010



8位?那最多编码256个字符,肯定不够啊?啊?那我大中华方块字怎么办?ASCII编码是一种二进制编码,完全由0和1组合的8位二进制数来编码字符。本质是给每个符号指定一个唯一的数值编号,这样就可以用二进制形式的编号来表示对应的符号。ASCII全称是American Standard Codefor Information Interchange,主要用于显示现代英语和其他西欧语言,256个编码足够了。其实标准ASCII只用到了后7位编码了128个字符。CODE0100001101001111010001000100010167686979





04


编码汉字




第一步:为每个汉字指定一个数值编号,也就是需要有一个涵盖了汉字的字符集。GBK,GB2312,Unicode都是字符集,其中GBK,GB2312都是专门为汉字编码提供的字符集,而Unicode生来就是为了一统天下,成就全球标准的,所以其收录的字符自然是最全的。


第二步:确定编号的二进制编码形式。ASCII编码的字符数量少,每个字符都用8位二进制来编码,只要8位一组就可以正确解码。


现在,为了编码更多的符号,不得不使用更多的二进制位,可选的编码方案有两种,第一种定长编码,就是每个符号仍占用相同的二进制位数,假设字符集一共为65535个字符进行了编号,则即使是那些8位二进制数就能表示的符号也要用16位来表示。



定长编码C00000000 00000000 00000000 010000116700000000 00000000 01001110 0001011019990


定长编码方式造成不可避免地浪费,而且常用字符通常编号比较靠前,因此有了第二种编码方案:变长编码。以8位二进制数为变化单位(一字节占8位),编号小于128的符号使用8位二进制数编码,且最高位(左侧第一位)为0。编号为128到2047之间的符号占用16位(2字节),且从左向右第一字节的前三位为110,第二字节的前两位为10。以此类推......



变长编码C67199900~127128~20472048~65535......01000011‭111001001011100001010110‭1110????‭10??????‭10??????0???????‭110?????‭10??????


采用变长编码方案,在解码时可以通过第一字节知道当前符号占用了多少二进制位来编码,同时避免了定长编码方案带来的浪费。这就是现行的UTF-8编码方式。



下面来个详细的例子,用UTF-8变长编码一个汉字。编号为30028的汉字“界”。1根据编号确定编码长度2用编号的二进制数位补齐编码0111010101‬001100‬30028300282048 < 30028 < 65535占用3字节‭1110????‭10??????‭10??????编码完成!‭1110????‭10??????‭10??????‭11100111‭10010101‭10001100‭11100111‭10010101‭1000110001110101 01001100






文章转载自幼麟实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论