Remove Accents from Text
Strip accents and diacritics: á→a, ñ→n, ü→u.
Works on any language — your text never leaves this tabRemove accents and diacritics from text
About this accent remover
Paste text and get it back without diacritical marks: café becomes cafe, señor becomes senor, über becomes uber. Handy for filenames, usernames, database keys, ASCII-only fields, and matching text where the accents vary between records. A toggle keeps the ñ intact for Spanish, where dropping it changes the word.
The conversion uses Unicode normalization rather than a hand-written lookup table, which is why it handles Spanish, Portuguese, French, German, Czech, Polish and Vietnamese without knowing anything about those languages. Everything runs in your browser: paste a customer list or an export from a production database and none of it leaves the page.
Here is the mechanism, because it explains both the strengths and the limits. Unicode can write é two ways: as the single precomposed code point U+00E9, or as the letter e followed by U+0301, the combining acute accent. The normalization forms defined in Unicode Annex #15 convert between them — NFC composes into single code points, NFD decomposes into base letter plus marks. This tool applies NFD and then deletes every character in the Combining Diacritical Marks block, U+0300 to U+036F. No table of letters is involved, which is also why stacked marks work: Vietnamese ế is e + circumflex + acute, three code points after NFD, and both marks fall inside the block, so a clean e comes out.
The honest caveat is the letters that are not a base plus a mark. ø, ł, đ, ß, æ, œ, þ, ð and Turkish dotless ı have no canonical decomposition in Unicode — they are distinct letters, not decorated ones — so NFD leaves them alone and this tool passes them through unchanged. Turning ß into ss or ø into o is transliteration, a per-language mapping, not accent stripping, and the right answer depends on context: German ö is o in one convention and oe in another. If you need those, map them yourself before or after running the text through here. One more subtlety: mixed-script input comes back in NFD form. Korean 한글 and Japanese が look identical afterwards but are now stored as decomposed sequences, so the text grows in code points even though nothing visibly changed.
And the case for not using this at all. If the goal is accent-insensitive searching or matching, do not destroy the data — compare it correctly instead. MySQL’s utf8mb4_0900_ai_ci collation is accent-insensitive and case-insensitive by design, PostgreSQL ships the unaccent extension, and in JavaScript Intl.Collator with sensitivity: “base” treats a and á as equal without touching either string. Strip accents when the destination genuinely cannot hold them: ASCII-only form fields, legacy fixed-width imports, URL slugs, and filenames that have to survive a trip between Windows, Linux and macOS — Apple’s HFS Plus stored filenames in a variant of decomposed Unicode while other volume formats use the precomposed form, which is exactly the mismatch that makes “the same” filename fail to match.
Which diacritics get stripped, and which letters don’t
Anything Unicode models as a base letter plus a combining mark in the U+0300–U+036F range is stripped, whatever language it came from. These are the marks people actually paste in:
| Letters | Result | Mark and language |
|---|---|---|
| á é í ó ú / Á É Í Ó Ú | a e i o u / A E I O U | Acute — Spanish, Portuguese, Czech |
| ñ ã õ | n a o | Tilde — Spanish, Portuguese |
| ä ö ü | a o u | Umlaut / diaeresis — German, Spanish ü |
| à è â ê î ô û | a e a e i o u | Grave and circumflex — French |
| ç | c | Cedilla — French, Portuguese, Turkish |
| ř š č ž ď | r s c z d | Caron — Czech, Slovak, Croatian |
| ą ę ż ś ć | a e z s c | Ogonek, dot, acute — Polish |
| ế ệ ừ ữ | e e u u | Stacked marks — Vietnamese |
The letters below are not accented letters at all. They are letters in their own right with no canonical decomposition, so normalization leaves them untouched and so does this tool. The third column is the conventional transliteration you would have to apply yourself — and it is a convention, not a rule.
| Letter | This tool returns | Usual transliteration |
|---|---|---|
| ß (German) | ß | ss |
| ø Ø (Danish, Norwegian) | ø Ø | o or oe |
| ł Ł (Polish) | ł Ł | l |
| đ Đ (Croatian, Vietnamese) | đ Đ | d or dj |
| æ Æ (Danish, Norwegian) | æ Æ | ae |
| œ Œ (French) | œ Œ | oe |
| þ ð (Icelandic) | þ ð | th and d |
| ı (Turkish dotless i) | ı | i |
Two rows deserve a second look. Danish and Norwegian å does get stripped to a, because it genuinely is a plus a combining ring above, while its neighbour ø does not — so a single word can come out half-converted. And Turkish İ (capital I with dot) strips to I while lowercase ı (dotless i) is left alone, which breaks the case pairing that Turkish depends on.
If you are debugging a mismatch rather than cleaning text, the useful question is usually normalization, not accents. Two strings that look identical on screen can differ in bytes because one is NFC (é as a single code point) and the other NFD (e plus a combining mark). Equality checks, sorting, regular expressions and string length all break on that, and nothing in the rendered text reveals it. In JavaScript, calling s.normalize(“NFC”) on both sides fixes the comparison without deleting anything, and the W3C recommends NFC for content on the Web. Strip accents only when the destination truly cannot store them.
How to remove accents in Excel, Google Sheets and Python
Excel has no accent-stripping function — nothing in Microsoft’s text function reference does it. The route that works in any version is nesting SUBSTITUTE, one level per letter.
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"á","a"),"é","e"),"í","i"),"ó","o"),"ú","u")Microsoft 365 shortens it with REGEXREPLACE, which takes a PCRE2 pattern, but its case_sensitivity argument defaults to case sensitive — capitals still need a second pass.
Google Sheets is a different answer. It has REGEXREPLACE too, but Google documents Sheets as supporting RE2 "except Unicode character class matching" — so the combining-mark class, the one pattern that would catch every accent at once, is missing there.
Python is the only one of the three that does it properly: normalize to NFD, the canonical decomposition that turns é into e plus a combining acute, then drop every combining mark.
import unicodedata
def strip_accents(s):
d = unicodedata.normalize('NFD', s)
return ''.join(c for c in d if unicodedata.combining(c) == 0)The field above runs that same NFD pass over the whole text at once — capitals, ñ and ü included — with a toggle to keep the ñ.
FAQ
Does it change the ñ?
By default ñ becomes n, but there’s a toggle to preserve it — useful when "año" and "ano" must stay distinguishable.
Which languages does it support?
Any language written in Latin script with diacritics: Spanish, Portuguese, French, German, Czech, Vietnamese, and more.
Does it affect uppercase letters?
Yes, equally: Á→A, Ñ→N, Ü→U. Casing is otherwise preserved exactly.