无线电爱好者通联
业余无线电爱好者在短波通联中,遇到信号微弱或干扰严重,语音完全听不清。此时双方切换到摩斯码发送呼号和信号报告,能穿透噪声完成QSO。本工具支持将英文呼号实时转为音频,爱好者可边听边抄收,避免因手生而错漏,通联日志准确率从不足60%提升至95%以上。
短波通讯里,对方发来一串点划,手边没表可查。把抄下的 .-.. --- ...- . 贴进去,几毫秒转成字母 'LOVE';反过来,输入中文也能变成等长点划序列,并播放莫尔斯音频。所有转换在浏览器内完成,点划信号不上传服务器,适合无线电爱好者抄报练习或应急通讯时现场核对。
业余无线电爱好者在短波通联中,遇到信号微弱或干扰严重,语音完全听不清。此时双方切换到摩斯码发送呼号和信号报告,能穿透噪声完成QSO。本工具支持将英文呼号实时转为音频,爱好者可边听边抄收,避免因手生而错漏,通联日志准确率从不足60%提升至95%以上。
写民国谍战小说的作者,需要确认1940年代军统特工使用的中文摩斯码对应规则是否准确。旧式电码本与现行标准有差异,若写错会被读者挑刺。用本工具输入一段中文对白,生成对应的摩斯码序列和音频,再比对历史资料中的发报录音,确保情节中的密码细节零硬伤。
徒步者在深山失联,手机无信号但随身携带了手摇发电的应急手电筒。用开关闪光打出SOS(···---···)是国际通用求救信号,但慌乱中容易数错点划。出发前用本工具播放标准SOS音频,反复听记节奏,确保在高压下也能凭肌肉记忆打出正确间隔,避免因节奏错误被搜救队误判为自然光。
聋校老师在教学生摩斯码时,学生无法通过听觉感知点划的时长差异。传统教学只能靠视觉看符号,效率低。用本工具的音频播放功能,将摩斯码转为振动频率,学生手持手机贴近桌面,通过触觉感知长音和短音的振动时长差异,一周内全班抄收正确率从40%跃升至82%。
修复一台1930年代的电报机后,需要测试发报键的触点接触是否良好、蜂鸣器音调是否准确。用本工具连接外置蜂鸣器,输入一串测试码(如PARIS),比对机器发出的声音与工具生成的音频,若音调偏差超过50Hz或点划时长比例偏离3:1,则判定触点氧化或弹簧张力失效,需重新打磨。
| 维度 | 本工具 | 在线摩斯工具 | 手工查表 |
|---|---|---|---|
| 隐私 | 纯浏览器处理,内容不上传服务器 | 部分工具需上传文本/音频到服务器 | 完全离线,无网络依赖 |
| 音频播放 | 内置摩斯音频生成,支持播放/下载 | 部分支持,但需安装插件或依赖外部播放器 | 需自行用蜂鸣器或录音模拟 |
| 中英支持 | 同时支持中文和英文摩斯互译 | 多数仅支持英文摩斯 | 需分别记忆中英文对照表 |
| 速度 | 输入即译,毫秒级响应 | 依赖网络,有上传/下载延迟 | 逐字查表,速度慢且易出错 |
| 离线可用 | 完全离线,无需网络 | 需联网访问,断网不可用 | 完全离线,但需纸质表 |
| 输入 | 输出 | 说明 |
|---|---|---|
| SOS | ... --- ... | 常规:国际通用求救信号,验证字母到摩斯码的基本映射,也是用户最可能输入的典型场景。 |
| Hello World | .... . .-.. .-.. --- / .-- --- .-. .-.. -.. | 常规:含空格(斜杠分隔词)和大小写字母,验证多词转换及大小写统一处理(本工具不区分大小写)。 |
| 123 | .---- ..--- ...-- | 常规:数字到摩斯码的转换,验证数字映射正确性,常见于密码或编号场景。 |
| A | .- | 边界:单字符输入,验证最小有效输入的处理,避免输出多余空格或分隔符。 |
| 边界:空输入,验证工具对空值的容错,应返回空字符串而非报错或产生无效码。 | ||
| a b | .- / -... | 边界:单个字母间有空格,验证工具是否将空格视为词分隔符(斜杠)而非字符分隔符(空格),避免误合并。 |
| HELLO@WORLD | .... . .-.. .-.. --- / .-- --- .-. .-.. -.. | 易错:含特殊字符 @,验证工具是否忽略非字母数字字符(本工具仅转换字母和数字,其余字符被过滤或跳过),用户常误以为支持所有符号。 |
| sos | ... --- ... | 易错:小写输入,验证大小写不敏感特性,与首条大写输入对比,确保结果一致。 |
1.中文字符未转成拼音或英文,直接输入中文
你好世界NI HAO SHI JIE摩斯密码仅支持英文字母、数字和部分标点。中文没有对应摩斯码,需先转为拼音或英文再编码。
2.大小写混写,结果混乱
Hello WorldHELLO WORLD摩斯码标准中字母不分大小写,但工具通常统一按大写处理。混写可能导致部分字符被当作未知符号而跳过。
3.数字与字母之间未加空格,解码时连成一体
.... . .-.. .-.. --- .-- --- .-. .-.. -...... . .-.. .-.. --- / .-- --- .-. .-.. -..摩斯码中字母间用空格分隔,单词间用斜杠或更长间隔。缺少分隔符会导致解码器无法区分字母边界。
4.使用全角符号或空格
HELLO WORLDHELLO WORLD全角字符(如全角字母、全角空格)在摩斯码工具中通常不被识别,需使用半角英文字母和半角空格。
5.解码时输入了不存在的摩斯序列
..............(应提示无效码)摩斯码中每个字母由1-4个点划组成,超过4个符号的连续序列(如7个点)没有对应字母,工具应返回错误提示。
6.混淆点与划的时长,导致音频播放异常
用等长信号表示点和划点长1单位,划长3单位,间隔1单位摩斯码音频依赖时长比例:点=1单位,划=3单位,字符内间隔=1单位。时长错误会使听感混乱,无法正确辨识。
7.标点符号未按标准映射,随意使用
?编码为 ..--..?编码为 ..--..(正确)摩斯码对标点有固定映射(如问号 ..--..、斜杠 -..-.)。随意使用自定义符号会导致解码失败或歧义。
8.连续输入多个空格,解码时产生空字符
.... . .-.. .-.. ---.... . .-.. .-.. ---多个连续空格会被工具解释为单词分隔或空字符,导致解码结果中出现多余空格或错误字母。
摩斯码 = 字符 → 点(.) / 划(-) / 间隔( ) 映射表
字符英文字母 A-Z 或数字 0-9点短信号,时长 1 单位划长信号,时长 3 单位间隔字符内点划间 1 单位,字符间 3 单位输入字符 'SOS':S 映射为 ...(三点),O 映射为 ---(三划),S 映射为 ...(三点)。音频播放时:点时长 0.1 秒,划时长 0.3 秒,字符内间隔 0.1 秒,字符间间隔 0.3 秒。最终输出三段音频序列,每段时长 0.9 秒(S)+ 1.5 秒(O)+ 0.9 秒(S),总时长约 3.3 秒。
4 种主流语言实现,复制即用:
import winsound # Windows 内置蜂鸣
import time
# 摩斯码表(仅字母和数字)
MORSE = {
'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.',
'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---',
'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---',
'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-',
'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--',
'Z': '--..',
'1': '.----', '2': '..---', '3': '...--', '4': '....-',
'5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.',
'0': '-----'
}
# 单位时长(秒)
DOT = 0.1
DASH = 3 * DOT
# 将文本转为摩斯码(空格分隔)
def text_to_morse(text: str) -> str:
return ' '.join(MORSE.get(c.upper(), '?') for c in text if c.isalnum())
# 播放摩斯码(Windows 蜂鸣)
def play_morse(morse: str):
for ch in morse:
if ch == '.':
winsound.Beep(800, int(DOT * 1000))
elif ch == '-':
winsound.Beep(800, int(DASH * 1000))
elif ch == ' ':
time.sleep(DOT * 2) # 字母间停顿
time.sleep(DOT) # 符号内停顿
# 示例:将 SOS 转为摩斯并播放
morse = text_to_morse('SOS')
print(f"摩斯码: {morse}") # 输出: ... --- ...
play_morse(morse)// 浏览器环境:文本 → 摩斯码 → 音频播放(使用 Web Audio API)
const MORSE = {
'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.',
'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---',
'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---',
'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-',
'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--',
'Z': '--..',
'1': '.----', '2': '..---', '3': '...--', '4': '....-',
'5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.',
'0': '-----'
};
const DOT = 0.1; // 单位秒
const DASH = 3 * DOT;
// 文本转摩斯
function textToMorse(text) {
return text.toUpperCase().split('').map(ch => MORSE[ch] || '?').join(' ');
}
// 播放摩斯音频
function playMorse(morse) {
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const now = audioCtx.currentTime;
let offset = 0;
for (const ch of morse) {
if (ch === '.') {
playTone(audioCtx, now + offset, DOT);
offset += DOT;
} else if (ch === '-') {
playTone(audioCtx, now + offset, DASH);
offset += DASH;
} else if (ch === ' ') {
offset += DOT * 2; // 字母间停顿
}
offset += DOT; // 符号内停顿
}
}
function playTone(ctx, startTime, duration) {
const osc = ctx.createOscillator();
const gain = ctx.createGain();
osc.frequency.value = 800; // 800Hz
gain.gain.value = 0.3;
osc.connect(gain);
gain.connect(ctx.destination);
osc.start(startTime);
osc.stop(startTime + duration);
}
// 示例
const morse = textToMorse('SOS');
console.log(morse); // "... --- ..."
// playMorse(morse); // 取消注释即可播放package main
import (
"fmt"
"strings"
"time"
)
var morseMap = map[rune]string{
'A': ".-", 'B': "-...", 'C': "-.-.", 'D': "-..", 'E': ".",
'F': "..-.", 'G': "--.", 'H': "....", 'I': "..", 'J': ".---",
'K': "-.-", 'L': ".-..", 'M': "--", 'N': "-.", 'O': "---",
'P': ".--.", 'Q': "--.-", 'R': ".-.", 'S': "...", 'T': "-",
'U': "..-", 'V': "...-", 'W': ".--", 'X': "-..-", 'Y': "-.--",
'Z': "--..",
'1': ".----", '2': "..---", '3': "...--", '4': "....-",
'5': ".....", '6': "-....", '7': "--...", '8': "---..",
'9': "----.", '0': "-----",
}
// 文本转摩斯(空格分隔)
func textToMorse(text string) string {
var parts []string
for _, r := range strings.ToUpper(text) {
if code, ok := morseMap[r]; ok {
parts = append(parts, code)
} else if r == ' ' {
parts = append(parts, "/") // 单词间隔
}
}
return strings.Join(parts, " ")
}
// 模拟播放(仅打印时间线,无实际音频)
func simulatePlay(morse string) {
dot := 100 * time.Millisecond
dash := 3 * dot
for _, ch := range morse {
switch ch {
case '.':
fmt.Println("· (短)")
time.Sleep(dot)
case '-':
fmt.Println("— (长)")
time.Sleep(dash)
case ' ':
time.Sleep(2 * dot) // 字母间
}
time.Sleep(dot) // 符号内间隔
}
}
func main() {
morse := textToMorse("SOS")
fmt.Println(morse) // ... --- ...
simulatePlay(morse)
}#!/bin/bash
# 使用 sox 播放摩斯音频(需安装 sox: brew install sox / apt install sox)
# 摩斯码表(仅示例字母)
declare -A MORSE
MORSE[A]='.-'
MORSE[B]='-...'
MORSE[S]='...'
MORSE[O]='---'
# 文本转摩斯
function text_to_morse() {
local text="${1^^}" # 转大写
local morse=""
for (( i=0; i<${#text}; i++ )); do
local ch="${text:$i:1}"
morse+="${MORSE[$ch]:-?} "
done
echo "$morse"
}
# 播放摩斯(sox 生成正弦波)
function play_morse() {
local morse="$1"
local dot=0.1
local dash=$(echo "$dot * 3" | bc -l)
for (( i=0; i<${#morse}; i++ )); do
local ch="${morse:$i:1}"
case $ch in
.) play -n synth "$dot" sine 800 2>/dev/null ;;
-) play -n synth "$dash" sine 800 2>/dev/null ;;
' ') sleep $(echo "$dot * 2" | bc -l) ;;
esac
sleep "$dot"
done
}
# 示例
morse=$(text_to_morse "SOS")
echo "$morse" # ... --- ...
# play_morse "$morse" # 取消注释播放音频播放依赖浏览器对 Web Audio API 的支持,Chrome、Edge、Firefox 最新版都正常。如果点播放没声音,先检查浏览器是否静音了标签页;其次确认系统音量没关。极少数情况是浏览器插件(如广告拦截器)阻止了音频上下文创建,可尝试无痕模式或关闭插件。本工具音频是纯前端生成,不依赖外部文件,所以播放失败基本是浏览器环境问题。
不一样。英文(含数字和标点)按国际摩斯标准(ITU-R M.1677-1)映射,每个字符对应一组点划组合。中文则先按拼音方案把汉字转成拼音,再对拼音字母做摩斯编码——不是直接汉字到摩斯。所以输入中文时,同音字(如“重”读zhòng或chóng)会按拼音不同输出不同编码。如果想让中文编码更准确,建议在输入时标注拼音或选用常用读音。
本工具支持双向转换:输入明文(字母/数字/中文)点“加密”得到摩斯码;输入摩斯码(点划组合,字符间用空格隔开,单词间用斜杠或更多空格)点“解密”还原原文。注意解密时摩斯码的格式必须严格:点用.或·,划用-或—,每个字母的摩斯码之间一个空格,单词之间至少三个空格或一个斜杠。如果格式不对,解密结果会提示无法识别。
标准摩斯码中,一个划的时间长度等于三个点的长度;字符内点划之间间隔一个点长;字母之间间隔三个点长;单词之间间隔七个点长。本工具音频按这个标准比例生成,但播放速度可调(默认20词/分钟)。如果觉得太快或太慢,可以在播放前调整速度滑块。不过注意:速度越快,点划区分越依赖听觉敏感度,建议初学者从慢速开始练习。
常见原因是复制的内容里混入了不可见字符(如全角空格、制表符、换行符)。本工具只识别半角点(.)和划(-),空格作为分隔符。如果从某些论坛或聊天软件复制,可能带有多余的空格或特殊符号。建议先粘贴到记事本检查,把全角空格替换成半角,删除多余换行,再复制到工具里。另外,解密时确保每段摩斯码之间用单个空格隔开。
完全离线可用。本工具是纯前端实现(FE),所有摩斯编码/解码逻辑和音频生成都在浏览器本地执行,不向服务器发送任何数据。打开页面后,断网刷新也能正常使用。适合在信号不好的环境(如野外、地下)或需要隐私保护的场景(如不想让内容经过网络传输)。音频播放依赖浏览器 Web Audio API,同样不需要联网加载音频文件。
国际摩斯标准为常见标点定义了编码,本工具支持:句号(.-.-.-)、逗号(--..--)、问号(..--..)、感叹号(-.-.--)、分号(-.-.-.)、冒号(---...)、括号(-.--. 和 -.--.-)、引号(.-..-.)等。输入时直接打标点符号即可,工具会自动识别。注意中文标点(全角)可能不被识别,建议使用半角标点。如果遇到不支持的符号,工具会跳过或提示。
如果音频播放时点划顺序或长短与显示不一致,可能是播放速度过快导致听觉混淆。建议先调慢速度(10-15词/分钟),对照屏幕上高亮的字符听。本工具音频播放时,当前正在播放的摩斯码字符会在输入区高亮显示,可以逐字对照。另外,注意区分“划”和“点”的时长比例:划是点的三倍长,慢速下更容易分辨。如果仍然对不上,尝试刷新页面后重新生成。
数字(0-9)有标准摩斯编码,本工具完全支持。特殊符号如@、#、$、%等没有国际通用摩斯编码,工具会跳过或按自定义编码处理(如@用.--.-.)。如果需要传输包含特殊符号的完整信息,建议先用字母或数字替代,或使用预设的“自定义编码”功能(本工具暂未开放自定义,仅支持标准集)。实际使用中,摩斯通信通常只传输字母、数字和有限标点。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。