电报之父塞缪尔·摩尔斯(Samuel Finley Breese Morse,1791年4月27日-1872年4月2日)是一名享有盛誉的美国画家。1837年发明了电报机,1839年发布了电报使用的编码:“摩尔斯”码。1844年5月24日华盛顿和马里兰州巴尔的摩之间的电报线成功地传送了圣经上的一句话“ What hath God wrought!”,这是人类历史上的第一份电报。
电报机
在铁棒外缠绕几百圈细导线就做成了一个电磁铁,电磁铁通电时会产生磁力,拖动上方的铁片敲击下边缘发出“嘀”的声音,断电时铁片恢复初始位置并敲击上边缘发出“嗒”的声音。因此这整个装置就叫做“发声器”。将其输入端连接到一个控制电源的按键开关装置,就组成了一个老旧的电报机。
V V 按键未按下时,电磁 铁未通电,铁片处于 水平位置。 按下按键时,电磁铁 通电产生磁力,吸引 铁片向下转动。 输出 输出 发送端 接收端
最初电报机的接收端是通过电磁铁控制一支笔和一卷匀速穿行的纸带,当按键按下时笔会接触纸带,如果按键快速按下,会在纸带上留下点“·”,而缓慢按下时则会在纸带上留下划“-”的痕迹。通过一条写有点和划的纸带可以传达什么信息?
摩尔斯编码
摩尔斯编码表(部分)
字符 编码 字符 编码 字符 编码 字符 编码 A ·- I ·· Q --·- Y -·-- B -··· J ·--- R ·-· Z --·· C -·-· K -·- S ··· 0 ----- D -·· L ·-·· T - 1 ·---- E · M -- U ··- 2 ··--- F ··-· N -· V ···- 3 ···-- G --· O --- W ·-- 4 ····- H ···· P ·--· X -··- 5 ·····
-·-· --- - · 快速按键 缓慢按键 间隔较长时间 间隔较短时间 将符号编码成点和划的组合, 加上两种间隔,这样就可以通 过“电”来传输语言信息了!
编码汉字
字符 编码 字符 编码 A 0100 0001 N 0100 1110 B 0100 0010 O 0100 1111 C 0100 0011 P 0101 0000 D 0100 0100 Q 0101 0001 E 0100 0101 R 0101 0010 F 0100 0110 S 0101 0011 G 0100 0111 T 0101 0100 H 0100 1000 U 0101 0101 I 0100 1001 V 0101 0110 J 0100 1010 W 0101 0111 K 0100 1011 X 0101 1000 L 0100 1100 Y 0101 1001 M 0100 1101 Z 0101 1010
8位?那最多编码256个字 符,肯定不够啊? 啊?那我大中华方 块字怎么办? ASCII编码是一种二进制编码,完全由0 和1组合的8位二进制数来编码字符。本 质是给每个符号指定一个唯一的数值编 号,这样就可以用二进制形式的编号来 表示对应的符号。 ASCII全称是American Standard Code for Information Interchange,主要 用于显示现代英语和其他西欧语言, 256个编码足够了。其实标准ASCII只用 到了后7位编码了128个字符。 C O D E 01000011 01001111 01000100 01000101 67 68 69 79
编码汉字
第一步:为每个汉字指定一个数值编号,也就是需要有一个涵盖了汉字的字符集。GBK,GB2312,Unicode都是字符集,其中GBK,GB2312都是专门为汉字编码提供的字符集,而Unicode生来就是为了一统天下,成就全球标准的,所以其收录的字符自然是最全的。
第二步:确定编号的二进制编码形式。ASCII编码的字符数量少,每个字符都用8位二进制来编码,只要8位一组就可以正确解码。
现在,为了编码更多的符号,不得不使用更多的二进制位,可选的编码方案有两种,第一种定长编码,就是每个符号仍占用相同的二进制位数,假设字符集一共为65535个字符进行了编号,则即使是那些8位二进制数就能表示的符号也要用16位来表示。
定长编码 C 00000000 00000000 00000000 01000011 67 世 00000000 00000000 01001110 00010110 19990
定长编码方式造成不可避免地浪费,而且常用字符通常编号比较靠前,因此有了第二种编码方案:变长编码。以8位二进制数为变化单位(一字节占8位),编号小于128的符号使用8位二进制数编码,且最高位(左侧第一位)为0。编号为128到2047之间的符号占用16位(2字节),且从左向右第一字节的前三位为110,第二字节的前两位为10。以此类推......
变长编码 C 67 世 19990 0~127 128~2047 2048~65535 ...... 0 1000011 1110 0100 10 111000 01 010110 1110 ???? 10 ?????? 10 ?????? 0 ??????? 110 ????? 10 ??????
采用变长编码方案,在解码时可以通过第一字节知道当前符号占用了多少二进制位来编码,同时避免了定长编码方案带来的浪费。这就是现行的UTF-8编码方式。
下面来个详细的例子,用UTF-8变 长编码一个汉字。编号为30028的 汉字“界”。 1 根据编号确定编码长度 2 用编号的二进制数位补齐编码 0111 010101 001100 30028 界 30028 2048 < 30028 < 65535 占用3字节 1110 ???? 10 ?????? 10 ?????? 编码完成! 1110 ???? 10 ?????? 10 ?????? 1110 0111 10 010101 10 001100 1110 0111 10 010101 10 001100 0111 0101 01 001100