モールス符号は、点(·)と線(—)だけであらゆる文字を表現できる符号系です。スマートフォンのアクセシビリティ機能からアマチュア無線まで、今も現役で使われています。このガイドでは、モールス符号の基礎と双方向変換の仕組みを解説します。

テキストをモールス符号に変換する →

モールス符号とは

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 標準のアルファベット・数字・一般的な記号をすべてサポート。サインアップ不要で、すべてブラウザ内で動作します。

モールス符号変換ツールを試す →