中文为什么不能直接转摩尔斯电码

工具相关 ·

把一段中文贴进摩尔斯电码转换工具,得到的结果是「跳过 12 个字符」的提示。这不是工具功能不全,而是摩尔斯电码本身就没有定义汉字。它诞生于 19 世纪的电报时代,为拉丁字母设计,覆盖范围从一开始就限定在字母、数字和少量标点。

摩尔斯电码的字符集

标准摩尔斯电码覆盖的范围是:

26 个英文字母(A—Z)
10 个数字(0—9)
约 18 个常用标点(. , ? ' ! / ( ) & : ; = + - _ " $ @)

总共不到 60 个字符。

这个范围的边界很清楚:它包含的是当时国际电报通信需要的基本符号。汉字、日文假名、西里尔字母、阿拉伯字母、emoji 都不在其中。

汉字电报是怎么做的

既然不能直接编码,那历史上的中文电报是怎么发的?

答案是电码本。中文电报采用了一套「四位数字码」的方案:给常用汉字各分配一个四位数字编号,发电报时把汉字换成数字,收报方再查表还原。

比如某个字的编号是 1234,那么发送时发的就是数字 1234 的摩尔斯电码(.---- ..--- ...-- ....-)。收报员收到后查码本,还原成汉字。

这套方案的问题是效率。一个汉字需要四个数字、每个数字五个符号,也就是 20 个符号。而一个英文字母平均只需要两到三个符号。所以同样的信息量,中文电报的发送时间要长好几倍。

另外,码本是通信双方的共同前提。发报方和收报方必须使用同一版本的码本,否则还原出来的字完全不同。这在战争时期是一个重要的安全问题——码本一旦被缴获,通信内容就被完全破解。

现在的替代方案

如果现在需要把中文转成摩尔斯电码,可行的做法是先转成拉丁字母,再编码。

最常用的是转成拼音:

你好 → ni hao → -. .. / .... .- ---

这样就能用标准摩尔斯电码表达了。需要注意的是,拼音方案有歧义(比如「西安」的拼音是 xian,与「先」同音),如果原文本身有歧义,转换后也会保留这个歧义。

另一种做法是转成数字编码,沿用历史上的电码本思路,或者使用 Unicode 码点。但这些方案的实用性都不如拼音——拼音至少接收方不需要额外的码本。

转换工具该怎么处理

一个设计合理的转换工具,遇到无法编码的字符时应该给出明确提示,而不是静默丢弃。

通常的做法是:跳过无法编码的字符,在结果里保留它们或者用占位符标记,最后统计并提示跳过了多少个字符。这样使用者能立刻发现问题,而不是拿到一段看似正常、实际丢了内容的密文。

如果工具什么都不提示,直接输出了「部分编码」的结果,会带来实际风险——使用者以为转换完整,实际上关键信息已经丢失。所以在使用任何编码转换工具时,都应该留意是否有「跳过了 N 个字符」这类提示。

一个更普遍的问题

这个现象不限于摩尔斯电码。很多编码方案都有明确的字符集边界,超出范围的内容无法表示。

常见的例子包括:

早期的短信编码(GSM-7)只覆盖拉丁字母和部分符号,中文需要用 UCS-2 编码,导致可容纳的字符数减半。

部分传统的条码格式(如 Code 39)只支持数字和大写字母,不能直接表示小写字母和汉字。

一些老式协议的头字段只接受 ASCII 字符,非 ASCII 内容需要额外编码(如 MIME 编码)。

所以遇到「转换结果不对」时,一个值得先检查的方向是:目标编码方案的字符集是否覆盖了输入内容。如果答案是否定的,那么问题不在于工具,而在于方案本身的边界。

检查清单

  • 摩尔斯电码只覆盖 A—Z、0—9 和约 18 个标点,不含汉字
  • 历史上的中文电报使用四位数字码本,效率低且依赖双方共享码本
  • 现在的做法是先把中文转成拼音,再按字母编码
  • 拼音方案会保留原文的歧义,转换前要考虑这一点
  • 转换工具应提示跳过了多少字符,使用时留意这类提示
  • 遇到编码问题时先确认目标方案的字符集是否覆盖输入内容
阅读 14