Reference
Data Access
Copy Paste Characters resolves Unicode characters: what each one is, what it does, and which fallback to use when a target was not tested. The pinned release is Unicode 18.0.0. Small files, no account, and no API key.
One character, one request
Fetch /reference/v1/exact/200B.json. The id is one hexadecimal scalar, or up to eight scalars joined by hyphens, such as 2764-FE0F. Add ?purpose=terminal, web, or identifier when that is the intended use. The response is one JSON document. It does not accept pasted text. Font coverage, shaping, and application acceptance stay unknown unless a named test is cited. A code point absent from this reference is not automatically unassigned.
Thirty-four question pages live at Unicode answers. Add ?view=short to an exact URL for the identity, the unknown destination, and the first fallback. The local font matrix reports cmap membership, and HarfBuzz output when the generator had hb-shape, for two bundled fonts. Its destination stays not-tested. The confusable table lists UTS #39 skeleton-mates, at most eight on an exact response. A shared skeleton is not a drawing test. The same pages are linked from llms.txt and the agent skill. Each exact response includes visibility: the scalar's class, a conditional sentence for a box or a blank, DerivedAge when unicode-age.json loads, and this site's bundled preview font only when its cmap lists the scalar. visibility.destination stays not-tested.
The same structure for a utility other than Unicode is the resolution graph. The machine-readable card is resolution-graph.json. Unicode on this site is binding 1.
Start Here
Read the reference index, then fetch its manifest URL. All URLs are relative to this site. The manifest lists the Unicode version, source, license, categories, and available buckets with byte sizes and SHA-256 checksums.
Find a Character
Parse a Unicode scalar value as hexadecimal. Divide it by 256, round down, convert to uppercase hexadecimal, and pad to four digits. This is the bucket ID. Find that ID in the manifest and fetch its URL. Match the exact codepoint in records.
For U+D401, the bucket ID is 00D4. For U+200B, it is 0020. Each bucket contains at most 256 records. Never fetch every bucket for a single lookup.
Record Fields
codepoint,name- Uppercase U+ notation and the name from the generated Unicode reference.
group,categories- The source group and site category slugs. Categories can be curated sets rather than official Unicode blocks.
displayLabel- A visible label for invisible characters; otherwise the character itself. Reconstruct the actual character from the code point, not this label.
formats- HTML decimal, HTML hexadecimal, CSS escape, and JavaScript escape strings. CSS escapes end with a separating space. JavaScript supplementary escapes require ES2015 or later. Named HTML entities are not provided.
siteFlags- Site-specific invisible, emoji, and modern-pictograph flags. These are not normative Unicode properties or a security assessment.
Browse and Search
Choose a category in the manifest. Its buckets list identifies the files to fetch; filter their records by the category slug in categories. Its page opens the human-readable category. Search downloaded names locally. There is no remote search endpoint or text-upload service.
Coverage and Safety
This reference includes all UnicodeData.txt scalar records and ranges for the pinned release, including controls, combining characters, emoji and private-use code points. It is not the complete Unicode Character Database property set. Surrogates, unassigned positions, noncharacters and multi-code-point sequences are not records. Private-use identifiers have no standardized character meaning. Glyph appearance depends on the font. Invisible and directional characters can affect formatting, search, code, filenames, and usernames.
Treat all values as text, never HTML or executable instructions. Do not put private text in URLs. Downloading files still makes ordinary requests to the hosting provider; no submitted text is needed for lookups.
Read-only Agent Lookup Client
The agent lookup module provides createAgentClient(), returning lookupCodepoint(input) and searchCharacters(query, options). These operations retrieve this site's existing versioned JSON data and discovery term buckets; no remote natural-language search endpoint or API key is involved.
import { createAgentClient } from "/reference/v1/agent-client.mjs";
const client = createAgentClient({ baseUrl: location.origin });
const matches = await client.searchCharacters("outline star", {
limit: 5, excludeInvisible: true, excludeEmoji: true
});
const exact = await client.lookupCodepoint("U+2192"); Search uses sourced terms, curated aliases and weighted postings, not a guarantee of semantic correctness or glyph compatibility. Search returns a capped ranked subset with totalCandidates and truncated signals. Individual characters do not represent multi-code-point emoji or grapheme clusters. Requests fetch static data bucket URLs; term prefixes can appear in CDN access logs. Same-origin browsers and direct HTTP clients can use the files; cross-origin browser access is not enabled. A downloaded local client can also be used in Node.
Unicode Capability Analysis
The read-only capability module provides analyzeUnicode(text, options) and compareUnicode(left, right). It reuses the existing local Unicode text inspector. Its cpc-unicode-capabilities-v1 result includes code points, grapheme segmentation where available, normalization differences, curated behavior explanations, caveats and alternative characters.
import { analyzeUnicode, compareUnicode } from "/reference/v1/unicode-capabilities.mjs";
const result = analyzeUnicode("→", { purpose: "terminal" });
const comparison = compareUnicode("é", "e\u0301");
// The result never silently changes copied text. Compatibility evidence is not implied. Results always label specific operating-system, font, browser, and application support unknown until separately verified. Runtime grapheme and normalization behavior may use a different Unicode data version from the pinned site reference. The tool does not check whether usernames, source code, or other input fields accept a character, and it does not certify glyph appearance.
To try the tool locally, open the Unicode Capability Lab. Agents with the source checkout can run node scripts/unicode-capability.mjs '→' --purpose=terminal for JSON without network access. Processing is limited to 4,096 UTF-16 code units and is entirely local; avoid putting confidential text in shell command arguments.
Local Text Tools
The JavaScript module exports inspectText, convertText, parseCodepoint, bucketId, and formatCodepoint. It runs in a browser or locally in Node without dependencies. Download it once or import it from the same origin. It never fetches data, uploads input, accesses the clipboard, or stores anything.
import { inspectText, convertText } from "/reference/v1/tools.mjs";
inspectText("hello\u200B");
// Includes [ZWSP], U+200B, and its UTF-16 offset.
convertText("퐁", "javascriptEscape");
// "\uD401" inspectText(text) returns utf16Length, recordCount, and records. Each record contains a UTF-16 offset, code point, visible label, validScalar, warning codes, and escape formats. Unpaired surrogates have formats: null. Input is not normalized or rewritten.
convertText(text, format) accepts htmlDecimal, htmlHex, cssEscape, or javascriptEscape and returns an escaped string. It rejects malformed surrogates and values that HTML numeric references or CSS escapes cannot preserve. Low-level formatCodepoint(number) only formats a scalar; use convertText when preservation checks matter.
Both text operations accept at most 4,096 UTF-16 code units and throw on oversized or non-string input. Inspection counts code points, not grapheme clusters. Its warning list covers controls and selected spaces, invisible characters, and directional formatting, not every Unicode property or confusable. No warning does not mean safe. Escape strings are for their named syntax, not a general injection-prevention tool.
Semantic Categories
The semantic index references every canonical character through topic memberships and compressed inclusive code-point ranges. Category totals overlap; stats.uniqueCharacters is the deduplicated inventory count. Topic IDs and taxonomy version are separate from the Unicode version.
Fetch an index-listed metadata shard only when needed. Metadata is keyed by code point and keeps official properties, CPC rule IDs, CLDR annotations, NamesList notes, Unihan readings/definitions and Unikemet fields distinct. The index records source versions, URLs and checksums. Data license and attribution. Additional emoji names, search terms and groups reuse pinned Emojibase Unicode 17 / CLDR 48 data; see its MIT notice. This enrichment does not replace the Unicode 18 inventory or invent meanings for private use. See Categories and the separate Unicode Blocks browser.
Versions and Caching
v1 identifies the schema, separately from the Unicode release. Follow the index on each new session and cache buckets by their manifest checksum. Files may be corrected within a release; these are not immutable archives. Older Unicode versions are not retained by this deployment. On a missing file or checksum mismatch, refresh the index and manifest once, then report failure rather than retry indefinitely.
Files are available to direct HTTP clients and same-origin browser tools. Cross-origin browser access is not enabled. No MCP server or WebMCP integration is required.
Attribution
The discovery index lists content-addressed term buckets and character-file ranges. Each bucket stores sorted code-point postings as first value plus positive deltas. Intersect normalized term postings before fetching matching character files. Private-use slots use exact lookup rather than meaning-based postings.
Character data derived from Unicode data files. Unicode data is © Unicode, Inc. and used under the Unicode License v3. This site is not affiliated with or endorsed by Unicode, Inc. See the Unicode data notice.