V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
also24
V2EX  ›  程序员

博多码(Baudot code)- 古老的 5bit 编码

  •  
  •   also24 · 2020-03-29 15:00:35 +08:00 · 5391 次点击
    这是一个创建于 1694 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文链接: https://blog.by24.cn/archives/character-encoding-baudot-code.html


    在上一篇文章聊了 摩尔斯电码 之后,接下来该聊聊博多码( Baudot code )了。

    博多码

    正如摩尔斯电码是源于电报,博多码也是因电报而生,而最早使用博多码的正是『博多式电报机』。

    博多式电报机 』由 Emile Baudot 发明,也得名于此, Baudot code 则是博多式电报机所使用的编码,使用 5 个 bit 进行编码,包含了两个字符集。

    其实应当称之为 5 波特( baud )更为合适

    基础介绍

    编码表

    先来看下博多码的编码表,搜索 Baudot code,我们可以找到这样一张草案图:

    显然,这并不是最后被使用的那一份,毕竟它存在着巨大的缺陷:没有数字 和常用符号。

    26 个英文字母 + 10 个数字 + n 个符号,那至少要 36 个状态了,5bit 最多表示 32 种状态,不够用啊。

    这也就是为什么 Baudot code 有两个字符集(字符平面)了:

    • Letter 字符集主要存字母

    • Figure 字符集则主要是数字和符号

    两个字符集(字符平面)之间,可以通过特殊的切换字符 letter shift figure shift进行转换

    其实这已经是在事实上将编码的长度从 5bit 拓展到了 6bit,但当时由于机械结构复杂度方面的原因,5bit 已经是极限,所以才引入了这个策略。

    这个状态转换,使得用 5bit 编码成为可能,但是也隐含了一个 『坑』,会在下文详述。

    完整的博多码(英文版,法文版略有不同)

    image-20200302222914173

    博多式电报机

    硬件结构

    有没有注意到这个表格里,第四第五列是放在左边的,中间还有空列?

    看一下博多式电报机的样子就明白啦,它是使用类似钢琴键的结构进行输入的:

    这里还有一个小细节,五个元音 A E I O U 以及半元音 Y 的输入,都不需要使用左手,单靠右侧三个按键即可输入,这其实也是在尽量压缩常用字符的编码,为发报员减负。

    附:博多式电报机的工作情况,可以参考这个视频:Emile baudot printing telegraph ( teletype )

    博多式电报机这种输入方式,完全不同于现在常用的 QWERT 键盘,而是更接近于我们在各类程序员笑话中见到的那个 Super Coder 2000 键盘:

    这样的键盘在输入效率上,确实比不上 QWERT 键盘,但是相比摩尔斯电码,其实已经进步了很多,毕竟现在只需要 『一次』输入,就可以发出一个字符了。

    那么,它的内部结构是如何实现的呢?

    这里我翻到一份文档,里面介绍了 『多路复用』的博多式电报机的结构,可以拿来参考一下:

    如上图,因为原图是四路复用,所以只需要看四分之一圈即可,两张图分别是接收结构和发送结构。

    可以看出,其实基础原理不算特别复杂,就是一个电刷在旋转,依次读取了 12345 四个琴键上的电平。

    听起来很容易,但也带来了新的挑战,发报员需要聆听机器的信号来了解自己现在是否可以发报了。

    其实这里还涉及到博多式电报机引入了负电压的情况,恕不赘述

    在上面介绍为什么博多码选择了 5bit 的时候,提到这是因为硬件结构复杂,但是从上面的结构图来看,似乎并不是很复杂的样子,这主要是因为它的译码部分。

    接收译码

    看完了上面的编码表和硬件结构,基本上就理解了博多码是如何通过博多式电报机进行发送的了。

    那么接收的时候怎么办呢,我们先来看一下摩尔斯电码当时是怎么做的:

    最开始的时候,摩尔斯电码其实是使用这样的纸带进行接收记录的,只是因为收报员发现,对于滴滴答答的声音来说,直接听声音比直接看纸带要容易多了,于是才转变为了现在的形态。

    博多码方面,因为每个字符都是 5bit,似乎更适合使用纸带了,但是事实上,博多式电报机走了另一条路:它直接输出字符。

    博多式电报机的输出结构上,有一个很精巧的凸轮结构,上面印有所有的可打印字符,通过这个凸轮,它可以直接将收到的电平信号转换以字符的形式打印在纸带上。

    还记得我们前面说博多码之所以只有 5bit,是因为受限于机械结构嘛?没错,并不是受限于键盘那边的结构复杂度,而是受限于这个凸轮实在不能做的更大了。引入 Shift 之后,凸轮被分成了两个,互相切换使用。

    更细节的结构,在这篇文章有更完整的描述,可以参考。

    编码特点

    看完了机器,现在我们回过头来继续说博多码自身的特点。

    定长编码

    相对于摩尔斯电码,博多码最大的一个改变就是:定长编码。

    将每个字符的编码定长为 5bit,使得编码解码都方便了不少。

    编码侧来说:

    因为编码定长,就可以根据编码长度直接制作出相应的『键盘』,减轻发报员的疲劳程度。

    同时,因为编码已经定长,不需要像摩尔斯电码一样,因为考虑编码效率采用霍夫曼树。

    博多码只给元音开了小灶,如果抽去元音不看,博多码的编码其实是有规律可循的,也更方便记忆。

    image-20200323182355636

    另外,在后期也出现了使用纸带作为发送内容载体的博多式电报机,这其实也得益于固定编码长度。

    解码侧来说:

    定长编码带来了巨大的便利,只需要确保双方同步,那么接收方在解码时就可以从容的『按组解码』。

    这也大大方便了机械解码结构的设计(这也是为什么博多式电报机可以自带打印结构)。

    多字符集

    前面提到,博多码为了在 5bit 里塞入超过 32 个字符,使用了 Shift 来切换两个不同字符集(字符平面)。

    从好的一方面来讲,在机械结构限制下,这样使用 5bit 虚拟出了 6bit 编码的效果,拓展了字符集的大小。

    但是,这样其实也带来了新的问题,因为原本字符编码这件事是 『无状态』的,加入 Shift 之后,编码解码一下子变成了 『有状态』的了。

    而状态的转换,需要做好约定,比如说:

    刚开始发送的时候,应该是哪一种状态?

    发送完一段电码之后,是否需要重置到某个状态?

    这个问题对大家的困扰,一直延续到了 ITA2 时代。

    评价

    毫无疑问,博多码在编码历史上绝对是非常重要的,它在后期也被标准化为 ITA1 编码(虽然没什么人用)。

    优点

    • 定长编码,飞跃性的改进
    • 努力拓展了字符集
    • 改善了摩尔斯电码的输入方式
    • 直接输出字符,便于查阅

    缺点

    • 引入 Shift 的概念,导致兼容性问题
    • 不支持大小写字符区分
    • 不支持换行等排版字符(但是有类似退格的操作符)

    参考资料

    为了写这篇文章,翻阅各种网站查阅了许多资料,在此一并列出,读者有兴趣可以进行参考:


    不用看啦,这儿没有二维码,只有原文链接:
    https://blog.by24.cn/archives/character-encoding-baudot-code.html

    8 条回复    2020-03-29 22:32:09 +08:00
    bitdust
        1
    bitdust  
       2020-03-29 15:18:16 +08:00
    哇,学到了。
    搞通信和搞计算机在中国还是个年轻的产业,在国外其实有很长的发展历史了。
    只有深挖这些发展历史才能知道现在用到的一些技术和约定是怎么发展起来的
    also24
        2
    also24  
    OP
       2020-03-29 16:15:32 +08:00
    @bitdust #1
    恩,我翻资料的时候就发现,国内关于这类『老古董』的资料非常的少。
    而许多国外网站有着详细的整理,还有许多人在努力维持着这些老古董的运行。

    了解这些编码的发展历史,有助于了解当时的人们遇到的问题和解决的思路,也是蛮有趣的。
    bitdust
        3
    bitdust  
       2020-03-29 17:41:12 +08:00
    @also24 我是看了您的这篇文章,才第一次知道[Shift]键原来是这样的由来
    小学刚学打字时,几乎是死记硬背 "按下 shift 可以敲出大写字母" 这样的知识
    现在第一次知道,最早设计[shift]是为了切换不同的字符码表,就像汽车齿轮换挡一样

    现在有多少被死机硬背的计算机知识,背后其实都是各种巧妙设计出来的
    RicardoY
        4
    RicardoY  
       2020-03-29 18:26:01 +08:00 via iPhone
    @bitdust 按下 shift 并没有切换状态啊 按住才是切换了 跟原文还是有很大区别的
    bitdust
        5
    bitdust  
       2020-03-29 18:34:28 +08:00
    @RicardoY 精神理解到位就行了~
    从电报机、电传打字机、电脑已经发展多少年了,我们不能保证其技术细节完全一致
    bitdust
        6
    bitdust  
       2020-03-29 18:36:31 +08:00
    @RicardoY 另外某些手机上的打字键盘,其 capslock 键和 shift 键合一了,又实现了模式切换功能
    also24
        7
    also24  
    OP
       2020-03-29 21:58:54 +08:00   ❤️ 1
    @RicardoY #4
    @bitdust #5
    其实 Shift 键是否来源于此确实有待探讨,打字机可能对键盘布局的影响会更大一些,而电报对编码的影响相对更大一些。

    我简单翻了一下,现代键盘上『 Shift 键』的出现,可能确实源自打字机在同一键位放置了不同的字符。
    但是博多码可能是最早使用 "Shift" 来表达『切换至另一字符集』这个概念的。


    参考资料:
    最早具备 Shift Key 的打字机是 1878 的 Remington 2 Typewriter:
    https://www.antiquetypewriters.com/typewriter/remington-2-typewriter/

    而博多码的发明与应用可以追溯到 1874 年:
    https://en.wikipedia.org/wiki/Baudot_code

    打字机和电报都历史悠久,暂不能完全确定我找到的资料是否准确。
    also24
        8
    also24  
    OP
       2020-03-29 22:32:09 +08:00   ❤️ 1
    @RicardoY #4
    另外补充一下,之所以以前是 『按下』,现在是 『按住』,和键盘的输入模式变化也有关联。

    博多式电报机的 『字符集切换』,切换的不只是『输入方式』,也包含了『编码方式』,也就需要在信号传输中引入一个显式的『切换动作信号』。

    而现代键盘的 "Shift" ,得益于编码方式的进步,只需要切换『输入方式』,并没有修改『编码方式』,也就是说从编码层面来看,其实并不存在『切换动作』,自然也就无须去管理它。
    如果键盘厂商乐意,实际上也是可以制造出按一下 "Shift" 就『自动锁定』的键盘的,就像前面 @bitdust 所说的手机键盘一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2769 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:46 · PVG 19:46 · LAX 03:46 · JFK 06:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.