é → 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
Processed in your browser · nothing is uploaded
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
| Text | Result | Setting |
|---|---|---|
Crème Brûlée | Creme Brulee | Default |
São Paulo | Sao Paulo | Default |
Žluťoučký kůň | Zlutoucky kun | Default |
Ça va, Zoë? | Ca va, Zoe? | Default |
Straße | Strasse | Default |
Straße | Straße | Special letters off |
Ærøskøbing | AEroskobing | Default |
Łódź | Lodz | Default |
Müller | Muller | Default |
Müller | Mueller | German umlauts on |
Καλημέρα | Καλημερα | Non-Latin: Keep |
Καλημέρα | Kalimera | Non-Latin: Transliterate |
Хрущёв | Khrushchyov | Non-Latin: Transliterate |
東京 Tōkyō | Tokyo | Non-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:
| Letter | Becomes |
|---|---|
ß | 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
ХрущёвbecomesKhrushchyov. 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
- Unicode Standard Annex #15: Unicode Normalization Forms
- MDN: String.prototype.normalize()
- Python documentation: unicodedata.normalize()
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.
