→ is the HTML entity for the right arrow →, U+2192 RIGHTWARDS ARROW, and → and → are its numeric references. HTML5 also reads →, →, → and →, though JSX doesn’t. In UTF-8 it’s E2 86 92.
Character → U+2192 RIGHTWARDS ARROW
Named →
Numeric → →
UTF-8 E2 86 92
Encoding a menu path gives Settings → Privacy.
Names are case-sensitive
⇒, with a capital A, is a different character: ⇒, U+21D2, the double arrow used for “implies”. The neighbors:
→ U+2192 → ⇒ U+21D2 ⇒
↑ U+2191 ↑ ↓ U+2193 ↓
↔ U+2194 ↔ ⟶ U+27F6 ⟶ (HTML5 only)
→ isn’t an emoji, so no platform swaps it for a color picture. ➡ (U+27A1) and ↔ are emoji and can be.
-> in JSX
In plain HTML, -> is fine: only < and & start markup in text. JSX is stricter. TypeScript rejects > in JSX text with TS1382: Unexpected token. Did you mean {'>'} or >?, and oxc, the compiler in Vite 8, stops with the same message; Babel and esbuild let it through. So <p>Next -> Billing</p> breaks a typed React project. Write →, an HTML 4 name every JSX compiler decodes, or {'->'}. A coding font with ligatures may draw -> as an arrow, but it’s still two characters.
Decorative arrows
Screen readers may announce the arrow, so a link like “Read the docs →” reads with extra noise. Hide it from assistive technology:
<a href="/docs">Read the docs <span aria-hidden="true">→</span></a>
For separators, CSS keeps the arrow out of the markup:
.steps li + li::before { content: "\2192"; padding-inline: 0.5em; }
Browsers don’t break a line at →: in a box too narrow for aaaa→bbbb, Chromium and WebKit let it overflow rather than wrap.
JSX decodes → in text; in braces write {'\u2192'}. CommonMark decodes → and the HTML5 aliases in Markdown text and leaves them literal in code spans.