三个短、三个长、三个短:为什么 SOS 要放 3.0 秒
绝大多数人记住的摩斯码是一串灯的形状,而不是一段时间。等到自己想给一段旧影像配电报音,或者核对一份老设备手册里的信号表,麻烦就来了:点和划各占多久,同一个字母里的符号之间停多久,字母之间、词与词之间又该停多久。SOS 之所以是 9 个音、约 3.0 秒,全部能从这几个数推出来。
比例是通行的那一套:点取 1 个单位,划取 3 个单位,同一码组内部的间隔是 1 个单位,字母之间 3 个单位,词与词之间 7 个单位。所谓「速度」并不改动比例,只改变基准点的长度——基准点一确定,后面每一档时长都是它的整数倍。
| 时长种类 | 合多少个点 | 13 档 | 5 档 |
|---|---|---|---|
| 点 | 1 个单位 | 92 毫秒 | 240 毫秒 |
| 划 | 3 个单位 | 276 毫秒 | 720 毫秒 |
| 字母之间 | 3 个单位 | 276 毫秒 | 720 毫秒 |
| 词与词之间 | 7 个单位 | 644 毫秒 | 1680 毫秒 |
基准点的算法也写得很直白:点的毫秒数取整自 1200 除以速度值。13 这个默认档位算出来是 92 毫秒,未取整的值是 92.307692;把速度调到 5 档,点就变成 240 毫秒;调到 20 档是 60 毫秒,拉满到 40 档只剩 30 毫秒。乘上比例之后,同一句在两端的速度下时长差出八倍。
图 1|基准点取 92 毫秒时,划与字母间隔同为 276 毫秒、单词间隔 644 毫秒。条形长度按时长等比。
一句长话要放多少个音,取决于符号数而不是字数
把整句字母表 THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 编出来是 104 个符号,其中点 54、划 50;按上面的时序逐音累加到末音结束是 37720 毫秒,末尾再补一个划的长度 276 毫秒,页面才报出 38.0 秒。听起来不算久,但它含空格有 43 个字符、35 个码组、9 个词,平均每个词不到四个码组、音却要十一个以上——真正的成本在间隔上,不在符号本身。
图 2|同一档速度下四条样例的音数与时长,条形按音数等比;日期那一串只有 10 个码组,却要 52 个音。
HELLO WORLD 是个更好用的对照:10 个码组、2 个词,编出来 32 个符号(点 19、划 13),按单位折算共 80 个单位,逐音累加 10488 毫秒。用 10488 除以基准点 92 恰好得 114.000 个点单位。我拿摩斯电码转换把这四句各放了一遍,页面上的提示写着「开始播放,共 32 个音,约 10.8 秒」——10488 加收尾那 276 毫秒再换算成秒,四舍五入正是 10.8。
码表没有想象的那么大,但也不按「不超过 5 位」长
- 整张表 54 个键:26 个字母、10 个数字、18 个标点,54 个码值互不重复,反查是一一对应的。
- 最短的码只有 1 位:点解出 E,划解出 T;数字一律 5 位,五个点就是 5,五个划就是 0。
- 长度超过 5 位的码有 13 个,全部是标点;最长的是 $ 的 7 位码 ...-..-。
这里要提醒一句和页面文案不一致的地方:解码失败的提示固定写着「每段只能由 . 与 - 组成且不超过 5 位」,可 7 位的 ...-..- 照样能解出 $,6 位的 .-.-.- 也能解出句点。那句话描述的是字母和数字的习惯长度,不是整张表的边界。同样,工具说明里写的「20 个标点」实际是 18 个,别照着它数。
容错是一张白名单,不是「长得像就行」
为了让手写稿里的各种破折号也能进来,编码前有一串替换:4 个字符归到点,5 个归到划,2 个归到词分隔。但它是白名单——全角星号、全角减号、中文句号、全角问号都不在其中,会原样留着。下划线反而被当成划,于是 A_B 编码时得到 .- ..--.- -...(下划线本身在表里,是 6 位的 ..--.-),可拿 A_B 去解码会得到 ? :下划线先变成划,整段连成一个超长的码组,反查不到。最直观的一例是 ._,先归一成 -.-,正好解出 K。
中文的情况更干脆:输入「中文 HELLO」,输出只剩 .... . .-.. .-.. ---,并明确写着「已跳过 2 个无法编码的字符:中 文」。想走中文只能先转成拼音或者四位电报码数字,中文转拼音这类先把字变成 Latin 的处理是必经的一步。全角标点同理被跳过,所以「中英文标点互译」这个说法在这张表里并不成立。大小写则完全不敏感,编码前一律转大写,hello world 与 HELLO WORLD 输出相同;素材里两种混着写的,先用大小写转换统一一遍更省事。
还能调的两样:速度与音调
速度输入框允许 5 到 40,钳位规则值得知道:留空、写 0、写 abc 都落回 13;写 500 或者 41 会被压到 40;写 -7、4 甚至 4.9 都抬到 5(先取整再钳位,小数部分直接丢掉)。音调不是连续的,只有 500、600、700、800 四个档,默认选中 600。
Q:为什么我打中文进去,出来是空的?
因为码表里没有汉字。整句「你好世界」四个字全部跳过,输出是空串,告警会列出被跳过的四个字。这不是编码失败,是这些字符压根不在表里。
Q:5 档和 40 档差多少,为什么要从慢的开始?
差八倍。5 档时点是 240 毫秒、单词间隔 1680 毫秒;40 档时点只剩 30 毫秒、单词间隔 210 毫秒。同一句 SOS 在慢档更容辨认,因为区分字母与字母的 3 个单位被放大了同样倍数。初学建议是 8 到 13 档。
Q:播放的结果能复现同一次吗?
不能。编码本身是确定的,同样输入永远得到同一串码;但播放的时刻只由这串码和当时那档速度即时算出,没有第三个参数可保存,想留证据应该记编码串而不是录音。
Q:常用信号表的码和现编的码一致吗?
一致,只是空格切法不同。DE 是 -.. .,CQ 是 -.-. --.-;AR 按字母逐个编码得 .- .-.,而信号表习惯把它写成连在一起的 .-.-.,是同一段音。表格与码表在这几条上互相对得上,可以拿来校自己的读法。