
Homoglyph Detector
Detect Unicode look-alike characters in text, URLs, and emails. Generate confusable strings for security testing.
Last reviewed: April 2026New to this tool? Click here for instructions
Suspicious characters are highlighted in yellow below. Click any highlighted character for details.
Paste any text, URL, or email address and instantly find Unicode characters from non-Latin scripts that visually impersonate ASCII letters — the foundation of every homoglyph phishing attack. Detection, generation, and side-by-side comparison run entirely client-side.
What This Tool Does
This tool scans an input string for homoglyphs — characters that share an indistinguishable visual form with ASCII letters but live at entirely different Unicode codepoints. The classic case substitutes the Cyrillic small letter a (U+0430) for the Latin small letter a (U+0061): both render as a in every common font, yet they are different characters with different bytes on the wire. A URL like аpple.com built from a single Cyrillic a renders identically to the legitimate apple.com but resolves to xn--pple-43d.com in Punycode — an entirely different domain that an attacker controls.
The detector covers the highest-risk confusable pairs from Cyrillic, Greek, Armenian, Latin small script variants, and a handful of look-alike symbol blocks. Every flagged character is reported with its full codepoint (in U+XXXX form), the source script, and the Latin codepoint it impersonates. The tool runs in three modes: Detect highlights confusables in a pasted string, Generate takes ASCII input and produces a homoglyph-encoded variant for authorized security testing, and Compare performs a column-by-column codepoint diff between two strings to surface hidden differences. All processing happens in your browser — no text is uploaded, stored, or logged. 🔒
How to Use It
The interface defaults to Detect mode. Paste a suspected URL, email address, or block of text into the input area. Suspicious characters are highlighted with a yellow background and an underline immediately; below the highlighted text, a table appears listing every flagged character along with its codepoint, source script, and the Latin character it impersonates.
Detect Mode
Type or paste the text you want to scan. Detection runs live with a 200-millisecond debounce — there's no Submit button. Each confusable character is wrapped in a yellow span, and the table below shows the actual codepoint (e.g. U+0430 CYRILLIC SMALL LETTER A), the source script label (Cyrillic а), and the Latin equivalent (Looks like "a" (U+0061)). Hovering a highlighted character also shows the same info as a tooltip. The status bar at the bottom reads No confusable characters detected. Text appears safe. in green when clean, or switches to red with a count when matches are found.
Generate Mode
Switch to Generate mode to produce a homoglyph-encoded version of an ASCII string — useful for authorized security testing, phishing simulation exercises, or building test fixtures for code that should detect homoglyph attacks. Type ASCII text on the left, and the tool substitutes each replaceable character with its first available confusable on the right. Use the Copy button to grab the result. Do not deploy generated strings in production-impersonating contexts without explicit authorization.
Compare Mode
Compare mode takes two short strings and produces a position-by-position diff table. Each row shows the character at that index in each string, both codepoints in U+XXXX form, and a verdict: SAME if the codepoints match, HOMOGLYPH if they differ but one is a known confusable for the other, or DIFFER for any other mismatch. This is the fastest way to confirm whether two visually identical strings are actually equal at the byte level — a common need when investigating a suspect email or comparing a copied URL against a trusted source.
Worked Example: аpple.com
- Input
аpple.com(the first character is Cyrillic, not Latin)- Rendered glyph
- Visually identical to
apple.comin every common system font - First character
- U+0430 CYRILLIC SMALL LETTER A — not U+0061 LATIN SMALL LETTER A
- Punycode form
xn--pple-43d.com— an entirely different domain that resolves to a different DNS record
- Paste the string into Detect mode. The first character renders against a yellow background. The status bar reads Found 1 confusable character — potential homoglyph attack.
- Read the detail table. One row appears: glyph
а, codepointU+0430, source Cyrillic а, looks like "a" (U+0061), risk CONFUSABLE. - Convert to Punycode. A real browser applies the IDNA2008 ToASCII algorithm to non-ASCII domain labels. The label
аpple(Cyrillic + four Latin) becomesxn--pple-43d— the prefixxn--signals an encoded label,ppleis the ASCII basis, and43dencodes the position and codepoint of the inserted Cyrillic character. - Verify against the legitimate domain. Switch to Compare mode. Enter
apple.comon the left andаpple.comon the right. Position 1 shows char A =a(U+0061), char B =а(U+0430), verdict HOMOGLYPH. Every other position shows SAME. The two URLs are visually identical and byte-different. - Inspect what your browser shows. Modern Chrome, Firefox, and Safari display this URL as
xn--pple-43d.combecause the label mixes Cyrillic with Latin and the resulting form is not a pure single-script IDN. Older browsers, terminal output, log files, and most email clients show the native form, leaving the user fully exposed.
The full breakdown of this example as an inline SVG diagram appears below. It visualizes the codepoint difference between the Latin a and the Cyrillic а, the resulting Punycode form, and the two characters' positions in the Unicode block map.
a, but they sit in different Unicode blocks. The IDNA2008 ToASCII pipeline encodes the mixed-script label аpple to the Punycode form xn--pple-43d, surfacing the attack in the browser address bar.How Many Confusable Pairs Each Script Contributes
Not all scripts are equally dangerous as homoglyph sources. The Unicode Consortium's confusables.txt file (current as of UCD 15.1) enumerates thousands of single-character confusable mappings against the Latin script. The chart below shows approximate confusable pair counts contributed by each major source script — these are the codepoints that map to Latin lowercase or uppercase letters in the standard skeleton normalization.
Raw count is not the right measure of risk. The Mathematical Alphanumeric Symbols block dominates the absolute count because every Latin letter has a styled twin in each of bold, italic, bold-italic, script, fraktur, double-struck, and sans-serif variants, plus uppercase versions of each — well over a thousand codepoints. In practice, these styled forms are rarely rendered without their distinguishing style (a math-italic 𝑎 reads visibly differently from a regular a in most fonts), so they pose less phishing risk per pair. Cyrillic and Greek lowercase letters are the highest operational risk because their default rendering is indistinguishable from Latin in nearly every standard font.
Common Use Cases
Phishing Email Detection
The single most common homoglyph deployment is in phishing campaigns that need to defeat URL-scanning gateways and human vigilance simultaneously. Attackers register a domain that visually mirrors a brand — раypal.com with Cyrillic р in place of Latin p — and send mail using that domain as the From address and as link text in the body. A user who copies the link, pastes it into this tool, and looks at the highlighted character map sees immediately that the sending domain is not the brand it claims to be. Security teams use the tool the same way during incident response, pasting suspect senders from quarantine queues to confirm the script-mixing fingerprint before escalating.
Suspicious Domain Analysis for Threat Intelligence
Threat intelligence analysts working through newly-registered domain feeds (NRDs) routinely encounter strings that look like legitimate brand names. Pasting the Punycode form into this tool's Compare mode against the legitimate brand reveals exactly which characters differ and which script the homoglyph came from — a useful provenance signal because certain attack groups have known script preferences. Cyrillic-heavy substitutions correlate with Russian-speaking actors using familiar input methods; Math Alphanumeric substitutions often indicate automated kits generating large domain inventories.
Code Review and Supply-Chain Defense
The Trojan Source attack class published by Boucher and Anderson in 2021 demonstrated that homoglyph identifiers and bidirectional control characters can hide malicious changes inside otherwise-clean-looking source files. A variable named uѕer (Cyrillic s) compares not-equal to user at the language level, so an attacker can declare a shadow variable that passes code review and diverges at runtime. Pasting a suspicious diff into Detect mode immediately highlights any non-ASCII characters in identifiers — pair it with the Unicode Inspector to drill into the underlying codepoints.
Trademark and Brand Research
Trademark attorneys and brand-protection teams use homoglyph analysis to identify domain squatters and counterfeit-product listings before they become operationally significant. The Compare mode is particularly useful here: paste the brand name and a suspect domain side-by-side and the position-by-position diff produces clean evidence suitable for a UDRP or URS filing. The combination of glyph-identical visual form plus byte-different underlying codepoints is exactly the pattern that arbitration panels recognize as bad-faith confusable registration.
Social Engineering Defense Training
Security awareness teams use Generate mode to produce realistic homoglyph training material — a phishing-simulation email that uses a Cyrillic-a domain pushes employees to read URLs character-by-character rather than accept the visual form as ground truth. Always pair generated training material with an authorized use policy. Generating homoglyph variants of third-party brands for unauthorized distribution may violate computer-misuse laws in your jurisdiction.
Edge Cases and Limitations
Homoglyph defense is a layered problem with several adjacent concerns that this tool intentionally treats differently. Knowing where the lines fall avoids both false confidence and false alarms.
Confusables vs. Full Homoglyphs
A homoglyph in the strict sense is a character whose glyph is rendered identically to another character by the font. A confusable is the broader UTS #39 term covering any pair that's likely to be visually mistaken — including cases where the glyphs are similar but not pixel-identical. The detector here treats both categories together because the operational distinction is rarely useful at security-decision time; a confusable that is 95% visually identical produces the same phishing outcome as one that's 100% identical. UTS #39 includes mapping for both classes in confusables.txt.
Digit-Letter Confusables (1 vs l vs I)
The Latin digit one (1 U+0031), the Latin small letter L (l U+006C), and the Latin capital I (I U+0049) are all ASCII characters that frequently confuse readers in sans-serif fonts. These aren't strictly homoglyphs — there's no cross-script substitution involved — but they create exactly the same phishing outcome (g00gle.com, paypa1.com, microsoft1.com). The detector does not flag these because doing so would generate constant false positives on legitimate ASCII text. Pair the homoglyph scan with a typosquat-aware DNS check for full coverage.
Mathematical Alphanumeric Symbols (U+1D400+)
The Mathematical Alphanumeric Symbols block at U+1D400 through U+1D7FF contains bold, italic, bold-italic, script, fraktur, double-struck, sans-serif, and monospace variants of every Latin letter — well over a thousand codepoints. 𝐚𝐩𝐩𝐥𝐞 (math bold) and 𝑎𝑝𝑝𝑙𝑒 (math italic) and 𝒶𝓅𝓅𝓁𝑒 (math script) all render visibly differently from regular ASCII, so they're less weaponizable in phishing, but they do show up in social-engineering attacks against platforms that strip styling (chat messages, plain-text logs). The detector currently focuses on default-rendering homoglyphs and does not flag the entire math block by default.
Cherokee, Coptic, and Armenian Uppercase
Cherokee (U+13A0-U+13FF) contains many uppercase Latin look-alikes — Ꮯ (U+13E0) for C, Ꭰ (U+13A0) for D, Ꭼ (U+13BC) for E, and others. Armenian uppercase letters and a handful of Coptic codepoints map to Latin uppercase as well. These attacks target acronyms and proper nouns more than lowercase domain names. Browser IDN policies typically flag any mixed-script label so display-layer defense covers most of the risk, but if you're parsing user-supplied content directly (chat, comments, code identifiers) you'll want to expand detection.
Browser Display Normalization
Modern browsers apply IDNA2008 plus UTS #46 plus script-mixing detection before deciding how to display an IDN. A pure single-script Cyrillic domain (every label is Cyrillic, no Latin mixed in) is displayed in its native form; a mixed-script label is displayed in Punycode (xn--). Chrome enabled this defense in 2017 and Firefox in 2018. This means the most dangerous homoglyph attacks are now the ones that use a single-script TLD plus single-script labels (all-Cyrillic.рф style), bypassing the script-mixing fallback. The detector still flags these because operationally they're indistinguishable from Latin to a casual reader, but be aware that the browser may render them natively.
Behind the Scenes
Unicode Technical Standard #39
UTS #39 (Unicode Technical Standard #39: Unicode Security Mechanisms) is the Unicode Consortium's authoritative document on identifier and visual-spoofing defense. It defines two foundational concepts: identifier profiles (Highly Restrictive, Moderately Restrictive, Minimally Restrictive, Unrestricted, ASCII-Only) that limit which characters and script combinations are permitted in security-sensitive contexts, and skeleton equivalence, a normalization that replaces each codepoint with a representative confusable codepoint and then NFKC-normalizes the result. Two strings are confusable under UTS #39 if their skeletons are equal. The companion data file confusables.txt ships with each Unicode Character Database (UCD) release and contains thousands of single-character mappings derived from glyph rendering analysis.
IDNA2008 (RFC 5891)
Internationalized Domain Names in Applications, 2008 revision (RFC 5891), governs how non-ASCII characters appear in domain names. It defines two algorithms: ToASCII converts a Unicode label to its Punycode encoding (the xn-- form) for DNS resolution, and ToUnicode reverses that for display. IDNA2008 superseded IDNA2003 to add a stricter validity model — characters are partitioned into PVALID (always allowed), DISALLOWED, CONTEXTJ/CONTEXTO (allowed only in specific contexts), and UNASSIGNED categories based on derived properties. UTS #46 layers on top to provide a compatibility mapping for legacy IDNA2003 inputs.
Browser Punycode Display Rules
Chrome's IDN display policy (introduced 2017, refined in subsequent releases) checks several conditions before showing a domain in native Unicode form: the entire label must come from a single script with limited exceptions; the script must be in a trusted set; the label cannot mix digit-only and letter forms in a confusable way; and the registry of the TLD must permit IDNs. If any check fails, the browser falls back to Punycode display. Firefox uses a similar policy with per-script whitelisting controlled by network.IDN.whitelist.* preferences. Safari and Edge use related but not identical heuristics. The result is a moving target: a domain that displays as Unicode in one browser may display as Punycode in another.
Visual Confusables vs. Semantic Equivalents
It is important to distinguish visual confusables (different codepoints rendering as the same glyph) from semantic equivalents (different codepoints with related linguistic meaning). The Latin a and Cyrillic а are visual confusables: their glyphs match but their semantics are entirely separate (one is a Latin vowel, the other a Cyrillic vowel). The half-width katakana ka カ and full-width katakana ka カ are semantic equivalents — different codepoints for the same character with different display widths. UTS #39 skeleton normalization treats both categories but for different reasons: visual confusables for spoofing defense, semantic equivalents for canonicalization. The detector here is focused on visual confusables — semantic equivalence is a separate concern handled by NFKC normalization in upstream input processing.
This Tool vs. Other Homoglyph Defenses
The detector here covers a specific layer of the homoglyph problem — codepoint inspection of user-supplied text. Other defenses operate at different layers and catch different things. The table below maps each tool to the cases it catches and the cases it misses.
| Defense | Layer | Catches | Misses | When to Use |
|---|---|---|---|---|
| This tool (Detect mode) | User-driven codepoint inspection | Any flagged confusable in any pasted text, URL, identifier, or email — with codepoint breakdown | Full UTS #39 skeleton equivalence beyond curated pair list; mathematical alphanumeric variants; bidirectional control characters | Ad-hoc verification of a suspicious URL or string; incident response; brand-protection investigation |
| Chrome / Firefox / Safari IDN warning | Browser address bar display | Mixed-script labels (auto-converted to Punycode); script combinations the browser policy distrusts | Single-script all-Cyrillic or all-Greek domains; non-URL contexts (email, document content, code); links inside HTML emails before click | Continuous passive defense for normal browsing — no user action required, always-on |
idnsafe / confusables.js libraries |
Application-level validation | Full UTS #39 skeleton equivalence; configurable identifier profiles; mixed-script analysis on arbitrary strings | Requires explicit integration; doesn't help with content already rendered to the user | Production validation of usernames, brand names at registration time, IDN input fields, user-generated content moderation |
UCD confusables.txt source data |
Raw Unicode Character Database | Authoritative single-character confusable mappings — used by every other tool in this row as the source of truth | Not directly usable — it's a data file, not a tool. Requires implementation work to integrate. | Building custom homoglyph detection; auditing the coverage of other tools; verifying a specific pair claim against the Unicode standard |
| DMARC / DKIM / SPF | Email authentication | Lookalike sender domains (the auth check rejects mail from an unauthorized homoglyph domain pretending to be the brand) | Homoglyphs inside message bodies; lookalike display names; URLs in body text pointing at homoglyph domains | Always-on for organizational mail flow — should be deployed regardless of other defenses |
| Linter / compiler identifier checks | Source code build pipeline | Mixed-script identifiers; non-ASCII characters in identifiers (when configured strictly) | Homoglyphs in string literals, comments, or external data; runtime-supplied identifier-like data | Continuous source-code defense — rustc, Go vet, ESLint, Pylint, and most modern toolchains support some form |
Frequently Asked Questions
A homoglyph attack substitutes one or more characters in a string with visually identical characters from a different Unicode script. The classic example replaces the Latin small letter a (U+0061) in apple.com with the Cyrillic small letter a (U+0430). The two glyphs are pixel-indistinguishable in most fonts, yet the resulting domain xn--pple-43d.com resolves to an entirely different server controlled by the attacker. Homoglyph substitutions are used in phishing emails, malicious domain registrations, deceptive package names on software registries, and code review evasion where a backdoored variable name appears identical to a legitimate one.
Modern browsers apply IDNA2008 (RFC 5891) plus UTS #46 to all Internationalized Domain Names, then run a script-mixing check before deciding whether to display the Unicode form. If a single label mixes characters from different scripts, or mixes a non-ASCII script with ASCII, the browser falls back to displaying the raw Punycode form, prefixed with xn--. Chrome enabled this defense in 2017 after the Xudong Zheng demonstration of аррӏе.com (all Cyrillic), and Firefox followed in 2018. Pure single-script IDNs from a recognized script (Cyrillic, Greek, Han, Arabic, etc.) are displayed in their native form when no script-mixing is detected.
Typosquatting relies on human typing errors and registers domains that resemble the target through swapped, omitted, or doubled ASCII letters — paypa1.com, gogle.com, microsft.com. The target is a careless typist. Homoglyph attacks operate at a different layer: the displayed domain renders identically to the legitimate one when rendered to pixels, so the attack succeeds even against a careful user who reads the address bar character-by-character. Typosquats can be caught by spell-aware filters; homoglyphs require explicit Unicode codepoint inspection or browser-level Punycode display logic to detect.
Yes — and this class of supply-chain attack is documented. The 2021 Trojan Source paper by Boucher and Anderson at the University of Cambridge showed that bidirectional control characters and homoglyph variable names can hide malicious logic inside otherwise-clean-looking source files. A variable named uѕer (Cyrillic s, U+0455) is a different identifier from user, so an attacker can declare a shadow variable that passes code review yet diverges at runtime. Modern compilers including rustc, GCC, and the Go toolchain now emit warnings when identifiers contain confusable mixed-script characters, and several linters block such identifiers outright.
UTS #39 (Unicode Technical Standard #39: Unicode Security Mechanisms) is the Unicode Consortium's authoritative document on identifier and visual-spoofing defense. It ships with a companion data file, confusables.txt, that maps each codepoint to its skeleton — a canonicalized form derived by replacing visually similar characters with a representative codepoint. Two strings are confusable if their skeletons are equal after NFKC normalization and confusable substitution. UTS #39 also defines restricted-script profiles (Highly Restrictive, Moderately Restrictive, etc.) that browsers, registrars, and security tooling apply to decide which IDN combinations are safe to display in native form versus which should be flagged or punycoded.
Most mainstream mail platforms apply some form of homoglyph detection in 2026, but coverage is uneven. Gmail and Microsoft 365 normalize display names and the sender domain through UTS #39 skeleton comparison and flag mixed-script addresses; both also enforce strict DMARC/DKIM/SPF alignment which catches most lookalike sender domains regardless of glyph confusion. Smaller mail hosts and self-hosted MTAs frequently lack this layer. Inside message bodies, very few mail clients warn about homoglyphs in links — the URL might display as paypal.com while the underlying anchor href points at xn--pypl-53d.com. Hover-to-preview still depends on user vigilance.
Three concrete controls. First, restrict identifier character sets in your linter — ESLint's no-misleading-character-class rule, Pylint's invalid-name with an ASCII pattern, or rustc's --forbid uncommon_codepoints all reject mixed-script identifiers. Second, run a pre-commit hook that scans new lines for non-ASCII characters and requires an explicit allowlist entry. Third, configure your package manager to validate that newly added dependencies' package names skeleton-match no existing dependency — npm has --ignore-scripts plus name-similarity checks, and tools like socket.dev surface typo/homoglyph squats on registries before install. Defense-in-depth: a single layer will miss something.
Spellcheckers operate on dictionary lookup. A word containing a Cyrillic а that visually reads as apple is still spelled correctly from the spellchecker's perspective — the lookup just fails to find it in the dictionary and either flags it as unknown or, more commonly in domain and identifier contexts, accepts it silently because it's classified as a proper noun. Spellcheckers don't perform script-mixing analysis, don't normalize through UTS #39 skeletons, and have no concept of visual confusability across scripts. Catching homoglyphs requires a different class of tool: a codepoint-aware scanner like the one on this page or browser-level IDN display logic.