v148 · Security · IDN

Domain Validator

Enter an internationalized domain name and see whether it passes IDNA2008 ContextJ rules as enforced by Chrome 148. The validator identifies Zero Width Joiner (ZWJ) and Zero Width Non-Joiner (ZWNJ) characters, verifies Unicode joining contexts, and compares against the browser's native URL parser.

Enter a domain name above and click Validate.

Sample domains — click to test

What ContextJ rules check

// Zero Width Non-Joiner (U+200C) is valid ONLY when:
//   1. Preceded by a Virama (e.g. Devanagari ् U+094D, Bengali, Gujarati, etc.), OR
//   2. In a valid cursive joining context: preceded by a Dual-Joining or Left-Joining
//      character and followed by a Dual-Joining or Right-Joining character (e.g. Persian/Arabic).

// Zero Width Joiner (U+200D) is valid ONLY when:
//   1. Preceded by a Virama

// Chrome 148 enforces RFC 5892 ContextJ rules directly in URL parsing.
// An ASCII domain with ZWNJ (e.g. "example‌com") is rejected and throws TypeError.
// Legitimate joining scripts (e.g. "نامه‌ای.com" or "ह्‌न.com") parse cleanly.

The joining-type and Virama tables this verifier uses are generated from the Unicode Character Database (unknown) by deno task joining-table rather than hand-picked ranges, and the Virama clause follows RFC 5892 §2.3 — Before(cp) is the character immediately preceding the joiner. Those tables are what the browser's own parser is held to, so a "verified clean" line below means this verifier and the spec agree, not just that the URL parsed.

references

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗