Slug Generator

é → e · ß → ss · ø → o

Remove Accents

Remove accents and diacritics from any text while keeping case, spaces and punctuation. Special letters such as ß, æ, ø and đ use the same table as the slug generator, and Chinese or Cyrillic text can be kept, transliterated or removed.

  • 100% in your browser
  • Same rules as the slug generator
  • Line by line
Non-Latin text

Chinese, Cyrillic, Arabic and other scripts stay as they are; only Latin and Greek accents go.

6 of 6 lines changed

Replaced characters

  • è → e
  • û → u
  • é → e ×2
  • Å → A
  • ö → o ×2
  • ã → a
  • ï → i
  • ç → c
  • ß → ss
  • Æ → AE
  • Ø → O
  • Ł → L
  • ó → o
  • ź → z
  • Đ → D
  • à → a ×2
  • ẵ → a
  • ộ → o
  • ü → u
  • έ → ε

This remove accents tool strips diacritics from text: Crème Brûlée becomes Creme Brulee and Đà Nẵng becomes Da Nang. It removes accent marks, maps special letters such as ß, æ and ø the same way our slug generator does, and lets you keep, transliterate or remove Cyrillic, Greek, Chinese and other non-Latin text. Paste one word or thousands of lines; spacing, case and punctuation stay as they are. Everything runs in your browser.

Before and after

TextResultSetting
Crème BrûléeCreme BruleeDefault
São PauloSao PauloDefault
Žluťoučký kůňZlutoucky kunDefault
Ça va, Zoë?Ca va, Zoe?Default
StraßeStrasseDefault
StraßeStraßeSpecial letters off
ÆrøskøbingAEroskobingDefault
ŁódźLodzDefault
MüllerMullerDefault
MüllerMuellerGerman umlauts on
ΚαλημέραΚαλημεραNon-Latin: Keep
ΚαλημέραKalimeraNon-Latin: Transliterate
ХрущёвKhrushchyovNon-Latin: Transliterate
東京 TōkyōTokyoNon-Latin: Remove

How accent removal works

Unicode can write é as one character or as e followed by a combining acute accent. The tool first applies NFD normalization, which splits every accented letter into its base letter plus combining marks, then deletes the marks (the Combining Diacritical Marks blocks, U+0300–U+036F and related ranges). This handles French, Spanish, Portuguese, Vietnamese, Czech, Polish, Romanian, Turkish and most other Latin-script languages in one step.

Marks are only removed from Latin and Greek letters (and Cyrillic when you transliterate), so Hindi, Thai, Arabic and other scripts that need their vowel signs are never damaged.

Special letters that are not accents

Some letters look accented but are separate letters in Unicode, so normalization leaves them alone. With "Special letters" on (the default), the tool maps them exactly as the URL slug generator does:

LetterBecomes
ßss
æ Æae AE
ø Øo O
œ Œoe OE
đ Đd D
ł Łl L
þ ðth d

German readers expect ä, ö and ü as ae, oe and ue, so Müller becomes Mueller; turn on "German umlauts" for German names. For other languages leave it off. Our transliteration guide covers language conventions in detail.

Non-Latin text

  • Keep (default): Chinese, Cyrillic, Greek and other scripts stay as they are. Greek still loses its tonos accents, so Καλημέρα becomes Καλημερα.
  • Transliterate: Cyrillic and Greek are romanized with the slug generator's tables, so Хрущёв becomes Khrushchyov. Other scripts are kept.
  • Remove: every non-Latin letter is deleted and leftover spaces are collapsed, leaving only the Latin text.

Code: remove accents in JavaScript and Python

Both give the tool's default result (checked against it for every test string):

// Same table as the tool: letters that Unicode does not split into base + accent.
const SPECIAL = { ß: 'ss', ẞ: 'SS', æ: 'ae', Æ: 'AE', œ: 'oe', Œ: 'OE', ø: 'o', Ø: 'O', đ: 'd', Đ: 'D', ð: 'd', Ð: 'D', þ: 'th', Þ: 'TH', ł: 'l', Ł: 'L', ı: 'i', ħ: 'h', Ħ: 'H', ŧ: 't', Ŧ: 'T', ŀ: 'l', Ŀ: 'L', ŋ: 'n', Ŋ: 'N', ſ: 's', ĸ: 'k', ƒ: 'f' };
const mapSpecial = (s) => [...s].map((c) => SPECIAL[c] ?? c).join('');

function removeAccents(text) {
  const s = mapSpecial(text.normalize('NFC')).normalize('NFD')
    // Drop combining accents only after a Latin or Greek letter, so other scripts stay intact.
    .replace(/([\p{Script=Latin}\p{Script=Greek}])[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]+/gu, '$1');
  return mapSpecial(s).normalize('NFC');
}
import unicodedata

# Same table as the tool: letters that Unicode does not split into base + accent.
SPECIAL = {'ß': 'ss', 'ẞ': 'SS', 'æ': 'ae', 'Æ': 'AE', 'œ': 'oe', 'Œ': 'OE', 'ø': 'o', 'Ø': 'O', 'đ': 'd', 'Đ': 'D', 'ð': 'd', 'Ð': 'D', 'þ': 'th', 'Þ': 'TH', 'ł': 'l', 'Ł': 'L', 'ı': 'i', 'ħ': 'h', 'Ħ': 'H', 'ŧ': 't', 'Ŧ': 'T', 'ŀ': 'l', 'Ŀ': 'L', 'ŋ': 'n', 'Ŋ': 'N', 'ſ': 's', 'ĸ': 'k', 'ƒ': 'f'}
MARKS = ((0x0300, 0x036F), (0x1AB0, 0x1AFF), (0x1DC0, 0x1DFF), (0x20D0, 0x20FF), (0xFE20, 0xFE2F))


def _is_mark(c):
    return any(a <= ord(c) <= b for a, b in MARKS)


def remove_accents(text):
    s = ''.join(SPECIAL.get(c, c) for c in unicodedata.normalize('NFC', text))
    out, after_latin = [], False
    for c in unicodedata.normalize('NFD', s):
        if _is_mark(c):
            if after_latin:
                continue  # an accent on a Latin or Greek letter
        else:
            name = unicodedata.name(c, '')
            after_latin = 'LATIN' in name or 'GREEK' in name
        out.append(c)
    return unicodedata.normalize('NFC', ''.join(SPECIAL.get(c, c) for c in out))

Need a URL slug rather than clean text? The URL slug generator removes accents, lowercases and joins words with hyphens in one go. If a link already shows %C3%A9-style escapes, decode it with the URL encoder/decoder.

Sources

FAQ

Frequently asked questions

How do I remove accents from text?

Paste the text into the box. Accented letters are replaced right away, for example é with e and ñ with n, and you can copy or download the result.

Why is ß not removed by normalization?

ß, æ, ø, đ and ł are letters of their own, not a base letter plus an accent, so NFD normalization does not split them. The "Special letters" option maps them to ss, ae, o, d and l.

Should ü become u or ue?

Use ue for German words and names (Müller → Mueller) and u for other languages such as Spanish or Turkish. Turn "German umlauts" on or off to match.

Does it change capital letters or punctuation?

No. Case, spaces, line breaks and punctuation are kept. Only accent marks and the special letters you choose are changed.

Can it process many lines at once?

Yes. Every line is processed separately, the counter shows how many lines changed, and you can download the whole result as a text file.

Is my text uploaded?

No. The conversion runs in your browser and nothing you paste is sent anywhere.

Need a URL, not just plain letters?

The slug generator removes accents too, then adds hyphens, lowercase, stop words and length limits.