Fold any accented text into ASCII

Paste international text and see every folding option at once. Know which substitution fits your use case — search indexing, URL slugs, filenames, or database keys.

Input

0 characters · 0 bytes (UTF-8)

Quick presets:

Folded Results

Enter some text with accented or special characters to see folding results.

When to use each strategy

Not all folds are equal. The right choice depends on where the text ends up.

Search Index

Folds diacritics to their base letter. Preserves spaces and most punctuation. ß becomes ss for German-aware matching. Best for Elasticsearch, PostgreSQL full-text search, or any system where users type "resume" but the document says "résumé".

Example: café naïvecafe naive

URL Slug

Lowercases everything, folds diacritics, replaces spaces with hyphens, strips non-alphanumeric characters. Matches what WordPress, Hugo, and most CMS platforms generate. Keeps URLs readable and shareable.

Example: Crème Brûlée Recipecreme-brulee-recipe

Filename Safe

Strips or replaces characters that cause trouble on Windows, macOS, or Linux filesystems. Removes slashes, colons, and control characters. Replaces spaces with underscores. Keeps the result portable across operating systems.

Example: Report: São Paulo/Q4Report_Sao_Paulo_Q4

Database Key

Maximum compatibility. Lowercase, no spaces, no punctuation, no diacritics. Uses underscores as separators. Designed for Redis keys, MongoDB field names, or any system with strict identifier rules.

Example: user: Müllerstraßeuser_mullerstrasse

Common mistakes and edge cases

The ß problem

German eszett (ß) folds to "ss" in German-aware systems but many general-purpose folds map it to "s". If your audience includes German speakers, test both. Searching for "strasse" should find "Straße" and vice versa.

Æ and Œ are letters, not decorations

In Danish and Norwegian, Æ is a separate letter that comes after Z. Folding it to "AE" changes sort order. In French, Œ is a ligature that some systems treat as "OE" and others leave as-is. Know your locale.

CJK has no ASCII equivalent

Chinese, Japanese, and Korean characters cannot be folded to ASCII. They need romanization (pinyin, romaji, romanized Korean). This tool marks them as un-foldable. Use a dedicated library for these scripts.

Normalization before folding

Unicode has composed forms (é as one code point) and decomposed forms (e + combining accent). Run NFC normalization first, or your fold might miss decomposed characters. Most programming languages have a normalize() function for this.

Preserving meaning vs. stripping

Sometimes folding changes meaning. The Spanish "año" (year) folded to "ano" (anus) is a classic example. For user-facing text, consider showing the original with the folded version as a hidden search field instead of replacing visible text.

Locale-aware vs. aggressive

Turkish has dotted and dotless I (i vs ı). Folding i→I without locale context breaks Turkish text. The aggressive fold ignores locale for maximum compatibility. The search fold tries to be smarter. Pick based on your data.

Unicode ranges covered

RangeBlockExampleFolds to
U+00C0–U+00FFLatin-1 SupplementÀ Á Â Ã Ä Å Æ ÇA A A A A A AE C
U+0100–U+017FLatin Extended-AĀ Ă Ą Ć Ĉ Ċ ČA A A C C C C
U+0180–U+024FLatin Extended-BƁ Ƃ Ƅ Ɔ Ƈ ƉB B B O C D
U+1E00–U+1EFFLatin Extended AdditionalḀ Ḃ Ḅ Ḇ ḈA B B B C
U+00DFGerman sharp sßss (or s)
U+00D0 / U+00F0Icelandic / ethÐ ðD d
U+0132–U+0133IJ ligatureIJ ijIJ ij
U+014A–U+014BEngŊ ŋN n
U+0152–U+0153OE ligatureŒ œOE oe
U+017FLong sſs
U+2018–U+201DSmart quotes' ' " "' ' " "
U+2013–U+2014Dashes– —- -
U+2026Ellipsis...
U+00A0Non-breaking space (space)

Implementation snippets

Copy these patterns into your own code. They cover the most common folding needs.

JavaScript (search fold)

function foldSearch(text) {
  return text
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .replace(/\u00DF/g, 'ss')
    .toLowerCase();
}
foldSearch('Crème brûlée'); // 'creme brulee'

Python (URL slug)

import unicodedata, re

def slugify(text):
    text = unicodedata.normalize('NFD', text)
    text = text.encode('ascii', 'ignore').decode('ascii')
    text = re.sub(r'[^\w\s-]', '', text).strip().lower()
    return re.sub(r'[-\s]+', '-', text)

slugify('São Paulo Café') # 'sao-paulo-cafe'

Generic regex (aggressive)

// Strip all non-ASCII after NFD decomposition
str.normalize('NFD')
   .replace(/[\u0300-\u036f]/g, '')
   .replace(/[^\x00-\x7F]/g, '')