UTF-8 to ASCII
Paste text and get a plain ASCII version that old systems accept. Accents are dropped (é → e), curly quotes and dashes become straight ones, € becomes EUR, and you choose what happens to characters like 東 or 😀 that have no ASCII version.
é → e · ß → ss · “ ” → " · ’ → ' · — → - · € → EUR
Fine-tune
Zoe's Cafe - EUR5
5 characters swapped for ASCII
Everything runs in your browser; nothing is uploaded.
How to convert UTF-8 to ASCII
ASCII has only 128 characters: English letters, digits, basic punctuation and a few control codes. Converting UTF-8 text to ASCII means replacing everything else with the closest plain character, a method usually called transliteration.
- Paste your text, or open a text or CSV file.
- Keep Swap é → e on to turn accented letters, curly quotes, dashes and symbols into their ASCII look-alikes.
- Choose what happens to characters that have no look-alike: a
?, nothing, or a code that keeps the character recoverable. - Copy the result or download it as a .txt file. The status line lists anything that couldn’t be converted.
What each character turns into
| Character | ASCII | Notes |
|---|---|---|
| é è ê ë á à ç ñ | e e e e a a c n | The accent is dropped and the letter kept |
| ü ö ä | u o a | Or ue oe ae with German style in Fine-tune |
| ß | ss | German sharp s |
| æ œ ø å ł | ae oe o a l | Letters that aren’t accents need their own rule |
| “ ” and ‘ ’ | " and ' | Curly quotes from Word, phones and Google Docs |
| – — | - | En dash and em dash |
| … | ... | One character becomes three dots |
| € £ ¥ | EUR GBP JPY | Currency codes, since ASCII only has $ |
| © ® ™ | (C) (R) TM | |
| ½ ² fi | 1/2 2 fi | Fractions, superscripts and ligatures |
| no-break space | space | Common in text copied from web pages |
| zero-width space, soft hyphen | removed | Invisible characters that break searches and imports |
| 東 😀 ° | your choice | No ASCII look-alike; see below |
Example: cleaning a price list for an old till
A café’s menu is typed in a word processor and imported into a till that only takes ASCII. One line reads:
Step 1: Drop the accents
Step 2: Straighten the punctuation
Step 3: Spell out the symbol
Result: Zoe's Cafe - EUR5. Every character is now ASCII and the line still reads correctly. A plain replace with ? converter would have given Zo?'s Caf? ? ?5, which is why look-alikes matter.
Characters with no ASCII version
Chinese, Japanese, Arabic and other scripts, emoji, and symbols such as ° have no ASCII look-alike. Pick what suits the system you are sending the text to. For Tōkyō 東京:
| Option | Tōkyō 東京 becomes | Use it when |
|---|---|---|
| ? | Tokyo ?? | You want to see where something was lost |
| remove | Tokyo | Clean text matters more than completeness, e.g. file names (a trailing space is left behind) |
| 日 | Tokyo 東京 | The text goes into an HTML or XML page, which shows the original characters |
| \u65E5 | Tokyo \u6771\u4EAC | The text goes into JSON, Java or JavaScript, which read the escapes back |
Only the last two keep the original recoverable. Once a character has become ? or been removed, nothing can tell you what it was, so keep the UTF-8 original.
Is UTF-8 the same as ASCII?
Not quite: UTF-8 contains ASCII. The first 128 UTF-8 characters are exactly ASCII, stored as the same single bytes, so a plain ASCII file is already a valid UTF-8 file. UTF-8 then adds over a million more characters, each stored as 2 to 4 bytes. You can see those bytes with the UTF-8 Converter.
You only need to convert when something accepts ASCII alone: older databases and mainframes, some bank payment references, label printers, legacy CSV imports, or file names and user names that must stay simple. Everywhere else, keep UTF-8, since converting always loses something.
Converting UTF-8 to ASCII with iconv, Python, JavaScript and PHP
# Command line (Linux)
iconv -f UTF-8 -t ASCII//TRANSLIT input.txt > output.txt
# Python: pip install unidecode
from unidecode import unidecode
unidecode("Zoë’s Café — €5") # "Zoe's Cafe -- EUR5"
// JavaScript: accents only
text.normalize("NFKD").replace(/[\u0300-\u036f]/g, "")
// PHP (intl extension)
transliterator_transliterate("Any-Latin; Latin-ASCII", $text);Each one behaves a little differently. iconv’s results depend on the system: on Linux with a UTF-8 locale it gives Cafe (in the bare C locale, Caf?), but the iconv on macOS and in Windows PHP writes Caf'e, with the accent as a separate character. Python’s popular unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') one-liner removes accents but silently deletes ’, — and € too (Zoes Cafe 5). The JavaScript line strips accents only, leaving quotes and symbols for you to handle. Unidecode also spells out Chinese and Japanese in Latin letters, so 東京 becomes Dong Jing.
Frequently asked questions
Does converting to ASCII lose information?
Yes, unless you use the &#…; or \u options. Accents, curly quotes and symbols are simplified, and the original can’t be rebuilt from the ASCII text, so keep a copy of the original.
Why did ü become u and not ue?
Dropping the accent is the general rule for every language. German has its own convention of writing ü as ue, ö as oe and ä as ae; turn on German style in Fine-tune to use it.
Why does my converted text have question marks?
Those characters have no ASCII look-alike: Chinese, Japanese and other scripts, emoji, or symbols like °. The status line lists them. Choose remove, &#…; or \u instead if a ? is not wanted.
Is ASCII text also valid UTF-8?
Yes. ASCII is the first 128 characters of UTF-8 with the same bytes, so the converted text can be used anywhere UTF-8 is expected.
Sources
- RFC 20: ASCII format for network interchange: the 128 ASCII characters
- RFC 3629: UTF-8: UTF-8 keeps ASCII as single bytes
- Unicode Standard Annex #15: Normalization Forms: NFKD, which separates letters from their accents
- iconv(1) Linux manual page: the //TRANSLIT and //IGNORE options
- Unidecode on PyPI: ASCII transliteration in Python
Related Tools
Build and preview Valorant crosshair settings.
Search common Vim commands.
Turn JSON rows into bar, line, or pie charts.
Convert WebP files and Base64 data in both directions.
Convert GIF files and Base64 data in both directions.
Save any GIF frame, or all frames, as JPG.