Compare Unicode strings before and after normalization
The Unicode code table text analysis can compare NFC, NFD, NFKC, and NFKD. The Fancy Text Generator itself has no general reverse-conversion feature.
Conclusion: Convert only compatibility characters that can be restored with NFKC, and restore irreversible decoration from the original text
The Mathematical Alphanumeric Symbols in 𝐇𝐞𝐥𝐥𝐨 change to Hello under NFKC. Full-width alphanumeric characters and some enclosed characters also have compatibility decompositions.
Small Caps lookalikes, Upside-down characters, strikethrough and underline Combining Marks, and strings assigned custom similar characters do not necessarily return to their original form with NFKC alone.
The current Fancy Text Generator does not implement reverse conversion. Check normalization results in the Unicode code table and do not overwrite the original data.
Determine which characters can and cannot be restored.
Normalize the string to NFKC, then check by code point which parts changed to the expected ASCII and which parts remained.
NFKC can lose meaningful notation differences, so do not apply it unconditionally to identifiers, signatures, or search indexes.
| Item | How to check | judgment |
|---|---|---|
| Mathematical letters | NFKC result | Check ASCII conversion |
| Fullwidth/Circled | Compatibility decomposition | Check that the value is intended |
| Combining decoration | Check for remaining marks | Consider individual removal |
| Similar characters | Code point reference table | Do not restore automatically |
A safe procedure for restoring normal characters
- Duplicate and save the original special-character string.
- Paste it into the Unicode code table and check the Code Points.
- Compare the NFKC result with ordinary characters.
- Restore remaining characters individually only when their source mapping is known.
- Verify that search, saving, and display requirements are met.
Do not immediately overwrite the original data with normalized results; check the differences.
Typical changes caused by NFKC
'𝐇𝐞𝐥𝐥𝐨'.normalize('NFKC') // 'Hello'
'ABC'.normalize('NFKC') // 'ABC'
'①'.normalize('NFKC') // '1'
Conversion results are based on the browser's Unicode normalization implementation. Because original decorative information is lost, distinguish this from reversible conversion.
Replace with Unicode characters rather than changing CSS fonts
| Method | Strings | Things that change internally |
|---|---|---|
| CSS Font | A → A | Keep U+0041 and render the Glyph differently with a Font |
| Fancy Unicode | A → 𝐀 | Replace the Code Point itself from U+0041 to U+1D400 |
| Combining marks | A → A̲ | Add a Combining Low Line after U+0041 |
Mathematical Alphanumeric Symbols are a set of characters defined to distinguish meanings in mathematical expressions. Stylish text for social media often uses them for decoration; it is not copying CSS font-family.
Use NFC, NFD, NFKC, and NFKD for distinct purposes
| Format | Main processing | Effect on decorative characters |
|---|---|---|
| NFC | Compose characters where possible after canonical decomposition | Align canonically equivalent representations, but do not convert all decorations back to ASCII |
| NFD | Canonical Decomposition | There is an example of decomposing é into e and Combining Acute Accent |
| NFKC | Compose after compatibility decomposition | 𝐀, 𝔸, A, ①, and similar characters may become A or 1. |
| NFKD | Compatibility Decomposition | Decompose compatibility characters, which can further become combining sequences |
NFKC is a way to make some stylish characters closer to ordinary alphanumeric characters, but it is not a general reverse conversion that fully restores upside-down characters, small-cap approximation characters, combining underlines, and similar forms. Do not apply it automatically to data that requires preserving its original notation.
Distinguish character count by graphemes, code points, and UTF-16.
| Counting method | Value of 𝐀 | Purpose |
|---|---|---|
| Grapheme Cluster | 1 | The number of characters visually recognized by the user |
| Unicode Code Point | 1(U+1D400) | Character assignment numbers and Unicode processing |
| JavaScript String.length | 2 UTF-16 Code Units | JavaScript indexes and existing input limits |
| UTF-8 | 4 Bytes | Storage capacity for databases, APIs, files, and communications |
Combining characters and ZWJ emoji can appear as one grapheme even when they contain multiple code points. To count visible characters in JavaScript, use Intl.Segmenter; to count code points, use for...of or Array.from rather than relying only on split("").
What DevelopTools can verify and cannot verify
| Item | Current tool operation |
|---|---|
| Input | Convert primarily letters and numbers, while leaving Japanese, emoji, line breaks, and unsupported symbols unchanged rather than deleting them |
| 21 styles | Serif and sans-serif bold and italic, monospace, script, Fraktur, double-struck, circled, squared, small caps, superscript and subscript, upside-down text, strikethrough, and underline |
| Unicode processing | When Intl.Segmenter is available, process by grapheme cluster; when unavailable, Array.from still does not split surrogate pairs |
| Display confirmation | Show the number of converted and target characters for each style to make unsupported characters easier to find |
| Save | Supports copying each result, saving TXT, favorites, and sorting recently copied styles |
| Unsupported | Full-width and enclosed forms, general reverse conversion, NFC/NFD/NFKC/NFKD execution, Unicode name and code point analysis, mixed-script/confusable detection |
| Data retention | Do not send input text or conversion results to the server, and do not save them in LocalStorage. Save only display settings and favorites on the device. |
To restore text to ordinary alphanumeric characters, compare normalization results, or analyze code points, also use a Unicode code table. To compare character counts, UTF-8 bytes, and UTF-16 code units, use a character-count tool.
Check display compatibility, searchability, and accessibility.
- If the destination font lacks the glyph, it may appear as a box or blank space, so paste it into the actual device and application to verify
- Even if text can be displayed in a profile body, it may not meet the allowed-character, length, or normalization rules for a username or ID
- For important information that needs search, screen reading, voice input, or editing after copying, also provide ordinary characters
- Do not mix visually similar Latin, Greek, Cyrillic, and other characters in identifiers or use them for impersonation or misidentification
- Do not use decorative Unicode in Passwords, URLs, Email Addresses, Source Code, or data to be signed.
What DevelopTools can display does not guarantee that the same glyph appears in every OS, SNS, browser, and application. Platform specifications change, so it does not claim that a character will always work in a specific service.
Primary sources for Unicode and JavaScript
- Unicode UAX #15:Unicode Normalization Forms
- Unicode UAX #29:Unicode Text Segmentation
- Unicode UTS #39:Unicode Security Mechanisms
- Unicode:Mathematical Alphanumeric Symbols
- MDN:String.length
- MDN:String.prototype.normalize()
- MDN:Intl.Segmenter
Use UAX #15 for normalization, UAX #29 for grapheme clusters, and UTS #39 for confusables and identifier security. Compare JavaScript implementations against MDN explanations for String.length, normalize(), and Intl.Segmenter.
Example: convert 𝐇𝐞𝐥𝐥𝐨 back to Hello
Paste into the Unicode table and compare the original text with the NFKC result.
Mathematical letters are compatibility-decomposed into ASCII letters, becoming Hello.
- Save the original text
- Display code points
- Check NFKC
- Check the difference
- Recheck at the copy destination
Information needed to convert back to the original style does not remain in the NFKC result.
Frequently asked questions
- Will converted characters display the same way on every device?
- Cannot guarantee. Even with a correct Code Point, it displays as □ if the OS or Application Font lacks the Glyph, and glyph shapes also differ by Font. Check actual display at the destination.
- Is the entered text sent to or stored on the Server?
- The current special-character and fancy-text conversion tool converts in the Browser and does not save input text or results to the Server or LocalStorage. Only display settings and favorites are stored on the device.
- Will running NFKC always restore ordinary characters?
- Only characters with defined compatibility decomposition can be restored. Upside-down text, lookalike characters, custom Mappings, combining decorations, and more may not be restored Losslessly, so retain the original string.