Morse Code Translator
Translate text to ITU Morse code and Morse back to text, with tolerant decoding and optional audio — entirely on this device.
Letters are always one space apart — other letter gaps would collide with Morse symbols.Decoding reads every separator — /, |, line breaks, wide spaces and tabs — whatever is selected here.
Press ? for shortcuts
Do it offline:$ morse -s "$(cat message.txt)"
How to use it
- Paste or type either form — plain text to turn into Morse, or dits and dahs to read back as text. The direction badge shows which way detection landed; click it or press s to override.
- Set the two policies when the defaults do not fit: unknown characters marked as ? or skipped, and the word separator used in Morse output — slash, pipe or newline.
- Check the chips under the result: tolerated symbols, collapsed separators, shared-code notes and unmapped characters are each counted there, with positions on the warnings.
- Copy the result, download it as a .txt file, share a permalink, or press Play to hear the Morse side as a 600 Hz tone at your chosen WPM.
Type text on one side and the International Morse alphabet appears on the other — or paste dits and dahs and read them back. Every mapping comes from ITU-R M.1677-1: twenty-six letters plus É, ten figures, fourteen punctuation signs, nothing invented. Decoding tolerates pasted underscores, pipes and typographic dashes, and counts each liberty in a chip. Characters the standard never assigned are marked or skipped, never guessed — and Play performs the result aloud at a speed you pick.
How it works
Morse writes each character as a short sequence of dits (.) and dahs (-). The proportions are fixed by ITU-R M.1677-1 Part I, Section 2: a dit lasts one unit and a dah three; the silence between the symbols of one character lasts one unit, between characters three, and between words seven. On this page the letter gap is printed as a single space and the word gap as a visible separator, so the written form stays unambiguous. Case does not exist in the code — hello, Hello and HELLO key identically, and decoded text always comes back in capitals.
Encoding normalizes the text to Unicode NFC, then looks up every character, caselessly, in the fifty-one-entry ITU table below. Anything without a row — !, ;, emoji, Greek or CJK — follows the unknown policy: a literal ? placeholder by default, or dropped under skip, and each occurrence is warned with its exact position. Decoding is deliberately forgiving about pasted notation: _ reads as a dah, · and • as dits, – — − as dahs, | and line breaks as word gaps, and doubled separators collapse — every tolerance actually used is declared as a counted chip.
Letters A to M, with the accented É after E — A .- · B -... · C -.-. · D -.. · E . · É ..-.. · F ..-. · G --. · H .... · I .. · J .--- · K -.- · L .-.. · M --
Letters N to Z — N -. · O --- · P .--. · Q --.- · R .-. · S ... · T - · U ..- · V ...- · W .-- · X -..- · Y -.-- · Z --..
Figures, 1 through 9 and then 0 — 1 .---- · 2 ..--- · 3 ...-- · 4 ....- · 5 ..... · 6 -.... · 7 --... · 8 ---.. · 9 ----. · 0 -----
Punctuation and signs, in the printed ITU order — . .-.-.- · , --..-- · : ---... · ? ..--.. · ' .----. · - -....- · / -..-. · ( -.--. · ) -.--.- · " .-..-. · = -...- · + .-.-. · × -..- · @ .--.-.
Examples
hello world.... . .-.. .-.. --- / .-- --- .-. .-.. -..Five letters, one space between each code, and the slash separator between the two words — the page default. h alone is four dits, and the whole phrase reads back as HELLO WORLD.
SOS... --- ...Three dits, three dahs, three dits. Typed as text the three letters carry normal letter gaps; the distress signal proper is keyed with none — the edge notes below hold that story.
__ ___ .-. ... . | -.-. ___ -.. .MORSE CODEA paste that never saw a straight keyboard: eight underscores were accepted as dahs and the pipe as a word gap, and the decoder declared both liberties in counted chips instead of fixing them silently.
café @ 9!-.-. .- ..-. ..-.. / .--.-. / ----. ?é owns a code of its own in the ITU list, and so does @ — but ! was never assigned one. The default mark policy prints ? in its place, and a position-anchored warning says exactly which character could not travel.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
SOS the word versus SOS the signal
Typed as text, SOS encodes as ... --- ... with normal letter gaps. The distress signal of the radio regulations is transmitted as one unbroken group, ...---..., with no internal gaps at all. Pasted that way it is a single nine-symbol token that maps to no character, so the unknown policy reports it honestly rather than quietly splitting it into letters.
× and X are the same code
The ITU table assigns -..- to both the letter X and the multiplication sign. Encoding × therefore adds a note about the shared code, and decoding -..- always returns X — the wire format simply cannot preserve the difference.
É is the standard's only accented letter
One accent made it into M.1677-1: É, whose code is ..-.. — and because input is NFC-normalized first, an é typed as plain e plus a combining acute accent encodes exactly the same way. Every other accented letter — à, ö, ñ — has no ITU row and follows the unknown policy instead.
Procedural signals are transmission control, not text
Section 1.1.3 of the recommendation defines six procedural signals — understood, error, invitation to transmit, wait, end of work, starting signal. They are not characters, so they have no rows here: -.- decodes as the letter K it spells, and the eight-dit error signal surfaces as an unknown token instead of pretending to be text.
Round trips return capitals and single gaps
Encode, then decode, and you receive the NFC uppercase of what you typed: the code has no case to carry, and any whitespace run in the source collapses to one word gap on the way in. Only text that is already uppercase with single spaces survives byte-identical.
The 128 KB cap refuses whole, never trims
Text grows roughly elevenfold on its way into Morse, so the cap keeps the output pane near 1.4 MB at worst and typing instant, with no worker round trip. Anything larger is declined outright — a partially translated message would read as a different message — and the banner hands you a CLI alternative.
Common errors
'a' at position 3 is not a Morse symbol — expected '.', '-' or a separator; switch to Encode for plain text- Raised while decoding .-a — a letter appeared where only ., -, their tolerated look-alikes and separators mean anything. Jump to error lands the cursor on the reported position; if the paste was actually plain text all along, the badge or the s key flips the direction and the same input encodes cleanly.
'!' at position 6 has no code in ITU Morse — output as '?'- The warning attached to encoding hello! — the exclamation mark sits outside the ITU table, along with & $ ; _ and %. Under mark, the output carries a visible ? at that spot so nothing vanishes untraced; under skip it is left out of the Morse, and the warning still records the position either way.
Input is larger than the 128 KB limit for this tool. For bigger payloads use the CLI: morse -s "$(cat message.txt)"- The island's refusal at the cap, printed with the page's own CLI escape hatch. The whole input is declined — no truncation, no partial translation — and the quoted morse utility from the bsdgames collection prints dots and dashes from the command line.
FAQ
Is this the official International Morse code?
Yes — every mapping is taken from ITU-R M.1677-1 (10/2009), the recommendation that defines International Morse: the letters A to Z plus É, figures 1 to 9 and 0, and fourteen punctuation signs, fifty-one characters in all. Nothing outside that list is ever encoded; unsupported characters are reported and marked, not improvised.
Why does ! come out as a question mark?
The exclamation mark has no code in the ITU recommendation — neither do &, $, ;, _ or %. Rather than inventing a non-standard sequence, the translator prints a visible ? placeholder under its default policy and names the character and position in a warning. Switch the policy to skip to leave such characters out of the output instead — the warning still tells you where they were.
How do I write SOS?
Type SOS in the text pane: it encodes to ... --- ... — dit dit dit, dah dah dah, dit dit dit. Strictly, distress traffic keys those nine symbols as one continuous group with no letter gaps, which is why the standard writes it as the single group ...---... rather than as three separate letters.
What do / and | between words mean?
They are word separators in the written form, not characters. This page emits ' / ' by default and can emit ' | ' or a line break instead; when decoding, all three are accepted at once, and any non-canonical gap that actually occurred is counted in a chip. The ITU fraction bar is different: as a character, / travels in code as -..-. — the bare glyph always reads as a gap.
How fast is the audio playback?
Play performs the Morse pane as a fixed 600 Hz sine tone at 10, 15, 20 or 25 words per minute — 15 by default. Speed follows the PARIS convention: one unit is 1200 divided by the WPM in milliseconds, a dit one unit, a dah three, gaps of one, three and seven. An estimated duration appears beside the control before you play anything.
Is Morse code encryption?
No. It is a public alphabet, standardized precisely so that anyone can read it — there is no key and nothing secret, and the table that decodes it is printed on this very page. Treat it as notation, like spelling. Anything that must stay confidential needs actual cryptography before it needs Morse.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Re-run the translation immediately, skipping the large-input debounce.
- ⌘/Ctrl + S
- Save the output pane to a .txt file (replacing the browser save dialog).
- ⌘/Ctrl + C
- Copy the full output while no text is selected; live selections copy as usual.
- ⌘/Ctrl + Shift + C
- Force-copy the full output even with a selection active.
- s
- Swap Encode and Decode; the detector re-reads whatever is in the input.
- t
- Step through the color themes (idle inside text fields).
- ? or ⌘/Ctrl + /
- Open the shortcut overlay, including browser-conflict notes.
- Esc
- Close the topmost overlay; the input is never cleared.