Count graphemes, code points, UTF-16, and UTF-8
Use the character count tool to check visible character count, Unicode Code Points, UTF-16 code units, and UTF-8 bytes at the same time.
Conclusion: Recount the converted string in the same unit used by the destination
Many Mathematical Alphanumeric Symbols are in the supplementary planes, and one code point is represented by two UTF-16 surrogate-pair units. Combining marks increase the number of code points themselves.
Whether an SNS or Application uses Graphemes, Code Points, UTF-16, or UTF-8 Bytes varies by service. Do not assume; also check the actual input field.
Unless the specification explicitly defines what “one character” means, frontend and backend length-limit checks may differ.
Identify the unit of the limit
Count the same string in groups of four and check which value matches the destination counter.
In databases, check UTF-8 bytes, index length, and 4-byte encoding support in addition to character limits.
| Item | How to check | judgment |
|---|---|---|
| Grapheme | Intl.Segmenter | Visual character count |
| Code Point | Array.from/for...of | Unicode character count |
| UTF-16 | String.length | JavaScript length |
| UTF-8 | TextEncoder | Storage / communication Bytes |
Steps for meeting the character-count limit
- Save the normal characters and the converted string.
- Paste the converted Text into the character count tool.
- Record grapheme, code point, UTF-16, and UTF-8 counts.
- Verify against the actual counter at the destination.
- If the limit is exceeded, reduce the decoration range or character count.
Do not directly adopt the pre-conversion ASCII character count.
The amount of expansion differs by style
| Input/output | Grapheme | Code Point | UTF-16 |
|---|---|---|---|
| A | 1 | 1 | 1 |
| 𝐀 | 1 | 1 | 2 |
| A̲ | 1 | 2 | 2 |
| 👩💻 | 1 | 3 | 5 |
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 10 ASCII characters to mathematical bold
Even if the visual appearance is 10 characters, UTF-16 may use two units per Latin letter.
The result may be Grapheme=10, Code Point=10, and UTF-16=20.
- Measure before conversion.
- Convert to bold
- Measure again after conversion.
- Check against the input limit.
If the backend has a UTF-8 byte limit, UTF-16 values alone cannot determine compliance.
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.