モールス符号は、点(·)と線(—)だけであらゆる文字を表現できる符号系です。スマートフォンのアクセシビリティ機能からアマチュア無線まで、今も現役で使われています。このガイドでは、モールス符号の基礎と双方向変換の仕組みを解説します。
モールス符号とは
1830年代、サミュエル・モースとアルフレッド・ヴェイルが電信機と合わせて開発した符号システムです。短い信号(点)と長い信号(線)の組み合わせで文字を表現します。
- 点(·):1単位の短い信号
- 線(—):3単位の長い信号
- 文字内の記号間隔:1単位
- 文字間の間隔:3単位
- 語間の間隔:7単位
この「1:3:7」の時間比率が守られることで、熟練した操作者は1分間に25語以上の速度で送受信できます。
モールス符号表
アルファベット
| 文字 | 符号 | 文字 | 符号 | 文字 | 符号 |
|---|---|---|---|---|---|
| A | ·— | J | ·——— | S | ··· |
| B | —··· | K | —·— | T | — |
| C | —·—· | L | ·—·· | U | ··— |
| D | —·· | M | —— | V | ···— |
| E | · | N | —· | W | ·—— |
| F | ··—· | O | ——— | X | —··— |
| G | ——· | P | ·——· | Y | —·—— |
| H | ···· | Q | ——·— | Z | ——·· |
| I | ·· | R | ·—· |
数字
| 数字 | 符号 | 数字 | 符号 |
|---|---|---|---|
| 0 | ————— | 5 | ····· |
| 1 | ·———— | 6 | —···· |
| 2 | ··——— | 7 | ——··· |
| 3 | ···—— | 8 | ———·· |
| 4 | ····— | 9 | ————· |
よく使う記号
| 記号 | 符号 |
|---|---|
| .(ピリオド) | ·—·—·— |
| ,(コンマ) | ——··—— |
| ?(疑問符) | ··——·· |
| /(スラッシュ) | —··—· |
プロサイン
プロサイン(手続き符号)は、文字間の間隔なしで送信する2文字の組み合わせです。アマチュア無線や歴史的な電信記録でよく使われます:
| プロサイン | 意味 |
|---|---|
| AR | メッセージ終了 |
| AS | 待機(スタンバイ) |
| BT | 段落区切り(= 相当) |
| CQ | 全局呼び出し |
| DE | 送信者の識別(〜から) |
| K | どうぞ(送信を促す) |
| SK | 交信終了 |
| SOS | 遭難信号(···———···) |
SOSが有名なのは、どの方向から見ても対称なパターンで、混乱した状況でも認識しやすいためです。
双方向変換の仕組み
テキスト → モールス符号:各文字を符号表で引いて置換します。語の区切りは / で表現します。同じ文字には必ず同じ符号が対応するため、変換は一意です。
モールス符号 → テキスト:/ や空白で分割して逆引きします。正しい間隔で送信されたモールス符号は一意にデコードできます。
JavaScript 実装
const MORSE_MAP = {
'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': '--..',
'0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.'
};
const REVERSE_MAP = Object.fromEntries(
Object.entries(MORSE_MAP).map(([k, v]) => [v, k])
);
function textToMorse(text) {
return text.toUpperCase().split('').map(char => {
if (char === ' ') return '/';
return MORSE_MAP[char] ?? '?';
}).join(' ');
}
function morseToText(morse) {
return morse.split(' / ').map(word =>
word.split(' ').map(code => REVERSE_MAP[code] ?? '?').join('')
).join(' ');
}
// 例
textToMorse('SOS'); // '... --- ...'
morseToText('... --- ...'); // 'SOS'
Python 実装
MORSE_MAP = {
'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': '--..',
'0': '-----', '1': '.----', '2': '..---',
'3': '...--', '4': '....-', '5': '.....',
'6': '-....', '7': '--...', '8': '---..',
'9': '----.',
}
REVERSE_MAP = {v: k for k, v in MORSE_MAP.items()}
def text_to_morse(text: str) -> str:
return ' '.join(
'/' if c == ' ' else MORSE_MAP.get(c.upper(), '?')
for c in text
)
def morse_to_text(morse: str) -> str:
words = morse.strip().split(' / ')
return ' '.join(
''.join(REVERSE_MAP.get(code, '?') for code in word.split())
for word in words
)
print(text_to_morse('SOS')) # ... --- ...
print(morse_to_text('... --- ...')) # SOS
実用的な用途
アマチュア無線(ハム無線):モールス符号(CW モード)は今も現役の通信手段です。音声より帯域が狭く、ノイズの多い環境でも届きます。日本では JARD やアマチュア無線連盟が資格試験を実施しており、モールス符号の知識が役立ちます。
アクセシビリティ:iOS・Android ともにモールス符号入力をサポートしています。スイッチアクセスなど一つの入力手段しか使えないユーザーでも、点と線の組み合わせですべての文字を入力できます。
組み込み学習プロジェクト:LED や圧電ブザーでモールス符号を出力するのは、マイコン(Arduino や Raspberry Pi Pico)の「Hello, World」として定番です。タイミング制御の練習にもなります。
CTF チャレンジ:セキュリティコンテストの問題で、音声波形や画像メタデータにモールス符号を隠した問題がよく出題されます。
オンラインで変換する
ZeroTool のモールス符号変換ツールは、テキスト↔モールス符号のリアルタイム双方向変換に対応しています。ITU 標準のアルファベット・数字・一般的な記号をすべてサポート。サインアップ不要で、すべてブラウザ内で動作します。