Short answer: Dozens of ordinary symbols are also registered as emoji. Whether you get a flat glyph or a colour picture depends on the character’s default presentation and on the font your device reaches for. You can force it either way by appending a variation selector: ︎ for text, ️ for emoji.
Not sure which character you’ve actually got? Paste it into the Symbol Identifier — it’ll name the code point and tell you what you’re dealing with.
One character, two jobs
When emoji were absorbed into Unicode, a large number of symbols that already existed — arrows, squares, card suits, weather signs, the copyright mark — were given a second life as emoji rather than being duplicated. That was the right call technically, and it’s the source of nearly every rendering surprise you’ve ever had with a symbol.
The result is that a character like ➡ carries two properties at once. It’s Emoji=Yes, meaning it’s part of the emoji set. And it has a default presentation, which decides what you get when nobody specifies. Unicode calls the second property Emoji_Presentation, and it splits these characters into two groups that behave quite differently.
If you’ve ever pasted a tidy black arrow into a document and watched it arrive at the other end as a fat blue cartoon, one of those two groups is why. Background on the underlying model is in what Unicode is.
Group 1 — emoji by default
These characters are supposed to be colourful. Emoji_Presentation=Yes means the standard says show the emoji form unless told otherwise:
| Symbol | Name | Code point |
|---|---|---|
| ⚪ | White circle | U+26AA |
| ⚫ | Black circle | U+26AB |
| ⬛ | Black large square | U+2B1B |
| ⬜ | White large square | U+2B1C |
| ⭐ | Star | U+2B50 |
| ⭕ | Hollow red circle | U+2B55 |
| ✅ | Check mark button | U+2705 |
| ❌ | Cross mark | U+274C |
| ⚡ | High voltage | U+26A1 |
| ⛔ | No entry | U+26D4 |
All twelve zodiac signs ♈–♓ (U+2648–U+2653) are in this group too, which catches people out constantly — see zodiac symbols.
If you want the flat version of any of these, you have to ask for it. That’s what the text variation selector does.
Group 2 — text by default, coloured anyway
This is the group that causes the real confusion, because the standard is on your side and your phone ignores it. These are Emoji_Presentation=No — the default is the plain text glyph — and yet they still show up in colour on most phones:
| Symbol | Name | Code point |
|---|---|---|
| ➡ | Right arrow | U+27A1 |
| ⬅ ⬆ ⬇ | Left, up, down arrow | U+2B05–U+2B07 |
| ▶ | Play button | U+25B6 |
| ▪ ▫ | Black and white small square | U+25AA–U+25AB |
| ♾ | Infinity | U+267E |
| ♠ ♣ ♥ ♦ | Card suits | U+2660, U+2663, U+2665–U+2666 |
| ☀ ☁ | Sun, cloud | U+2600–U+2601 |
| ☑ ✔ ✖ | Ballot, check, multiply | U+2611, U+2714, U+2716 |
| © ® ™ | Copyright, registered, trade mark | U+00A9, U+00AE, U+2122 |
| ✝ ☪ ✡ | Latin cross, star and crescent, star of David | U+271D, U+262A, U+2721 |
Why do they turn colourful if the default says text? Font fallback. Mobile systems reach for the colour emoji font early, and once it supplies a glyph the text form never gets a look in. The character is correct; the rendering pipeline overrides it.
This is worth knowing precisely, because the fix differs by group. For Group 1 you’re overriding the standard. For Group 2 you’re reasserting it.
A neat illustration sits inside one Unicode range: ◻ U+25FB and ◼ U+25FC are text by default, while ◽ U+25FD and ◾ U+25FE — the medium-small squares right next to them — are emoji by default. Four near-identical squares, two different behaviours. More of these in shape symbols.
The two variation selectors
A variation selector is an invisible character you place immediately after the symbol. It doesn’t print, take space or move the cursor visibly — it just instructs the renderer.
- U+FE0E VARIATION SELECTOR-15 (VS15) — force text presentation. HTML:
︎ - U+FE0F VARIATION SELECTOR-16 (VS16) — force emoji presentation. HTML:
️
In HTML:
html
<p>Text form: ➡︎</p> <!-- ➡ + VS15 -->
<p>Emoji form: ➡️</p> <!-- ➡ + VS16 -->
In JavaScript or CSS, that’s '\u27A1\uFE0E' and '\27A1\FE0E' respectively.
One limit worth knowing: selectors only work on characters Unicode actually lists as having both forms. Adding VS15 to a character with no text variant does nothing — it doesn’t break anything, it simply has no effect.
Where this actually costs you
- Documents that get printed. A colour emoji in a bulleted list prints as a colour picture, or as a grey blob on a mono printer.
- Résumés and CVs. Applicant tracking systems handle emoji inconsistently. This is why résumé symbols sticks to characters with no emoji identity at all.
- Email signatures and newsletters. The same divider renders flat in a desktop client and cartoonish in a mobile one. Newsletter dividers covers safer picks.
- Spreadsheets. Emoji forms are wider than text glyphs and wreck column alignment.
- Anything with mixed platforms. The full picture is in iPhone vs Android symbols.
The better fix: pick a character that was never an emoji
Variation selectors work, but they’re a hidden character travelling with your text — and plenty of systems strip them on paste, on import, or when saving to plain text. If the symbol is going somewhere you don’t control, the durable answer is to choose a character that has no emoji identity in the first place.
- Instead of ➡ U+27A1, use → U+2192 RIGHTWARDS ARROW. Never an emoji, renders flat everywhere. See arrow symbols.
- Instead of ✅ U+2705, use ✓ U+2713 CHECK MARK. See check mark symbols.
- Instead of ⭐ U+2B50, use ★ U+2605 BLACK STAR. See heart and star symbols.
- Instead of ♾ U+267E — which is officially PERMANENT PAPER SIGN, not a maths symbol — use ∞ U+221E INFINITY. See the infinity symbol.
- Instead of ⬛ U+2B1B, use ■ U+25A0 BLACK SQUARE.
This is the approach worth defaulting to. The variation selector is the tool for when you’re stuck with a specific character.
Windows, Mac and Office
Inserting an invisible character by hand is awkward, which is why most people reach for a substitute instead. If you do need it:
- Word: type the symbol, then
FE0Efollowed by Alt + X. The selector is appended invisibly. You can confirm it’s there because pressing backspace once removes the selector, not the symbol. - Mac: enable Unicode Hex Input and press Option + FE0E after the character.
- Web and apps: paste the HTML entity
︎where entities are supported, or copy a pre-composed text-presentation sequence.
Note that the emoji pickers — Windows key + . and its Mac equivalent — always insert the emoji form. They’re the wrong tool if you want flat glyphs.

CSS has a newer answer
The font-variant-emoji property lets you set presentation in the stylesheet rather than in your content:
css
.flat{font-variant-emoji:text;} /* behaves like VS15 */
.fun {font-variant-emoji:emoji;} /* behaves like VS16 */
It only affects characters that have both presentation forms, and an explicit variation selector in the text still wins over the CSS. Browser support is still uneven, so treat it as an enhancement and keep variation selectors or safer character choices as the actual guarantee.
Accessibility
Presentation changes what a screen reader says. In emoji form, ➡ is typically announced by its CLDR emoji name — “right arrow” — while the text form is read by its Unicode character name. For decorative runs the emoji form is worse: each one is announced in full, so a row of five coloured squares becomes five spoken phrases. Pair any meaningful symbol with a word, and hide purely decorative runs from assistive technology. How screen readers pronounce symbols has the detail.
Troubleshooting
| Problem | Fix |
|---|---|
| Symbol is colourful on phones, flat on desktop | It’s an emoji-registered character. Append VS15 ︎, or swap to a non-emoji equivalent. |
| VS15 makes no difference | That character has no text variant, or the platform ignored the selector. Swap the character instead. |
| Selector disappeared after copy-paste | Plain-text fields and some editors strip variation selectors. Use a non-emoji character. |
| Symbol shows as an empty box | Different problem — that’s a missing font glyph. See symbols showing as boxes. |
| Symbol width changes between devices | Emoji glyphs render wider than text glyphs. Expect column and alignment drift. |
| Want the colour version and can’t get it | Append VS16 ️, or insert from the emoji picker. |
Recap
| Situation | Do this |
|---|---|
| You control the font (your own site) | font-variant-emoji, or VS15 |
| Text goes somewhere you don’t control | Use a non-emoji character |
| Writing HTML | ︎ for text, ️ for emoji |
| Printing or exporting to PDF | Non-emoji character, always |
| You want the emoji deliberately | VS16, or the emoji picker |
Frequently asked questions
Why does my symbol turn into a colour emoji on my phone?
Because the character is registered as an emoji as well as a text symbol, and mobile systems reach for the colour emoji font first. The character itself is unchanged — only the glyph the device picked is different.
What is a variation selector?
An invisible character placed right after a symbol to choose its appearance. U+FE0E forces the flat text form, U+FE0F forces the colour emoji form. Neither prints or takes up space.
How do I stop a symbol rendering as an emoji?
Append U+FE0E immediately after it — in HTML that’s ︎. More durable still, use a character that was never an emoji, such as → instead of ➡.
Do variation selectors work everywhere?
No. They work on characters Unicode lists as having both forms, and many plain-text fields strip them on paste. Where the destination is out of your control, choose a non-emoji character rather than relying on the selector.
Which symbols are emoji by default?
Characters with the Emoji_Presentation property, including ⚪ ⚫ ⬛ ⬜ ⭐ ⭕ ✅ ❌ ⚡ and all twelve zodiac signs. Those need a variation selector if you want the flat form.
Is a symbol showing as a box the same problem?
No. An empty box means no font on the device has a glyph for that character. Emoji-versus-text is about which of two available glyphs gets chosen.
Written by Igor R. Tested on Windows 11, macOS, iOS, Android and Linux. Last updated September 2026. Character properties follow the Unicode Standard and UTS #51.