Skip to main content
Best Emojis

Home > Blog > Technology

Technology
variation selector
text vs emoji
heart symbol

♥ or ♥️? The Invisible Character That Turns a Symbol Into an Emoji

By BestEmojis Team·October 22, 2026·10 min read
♥ or ♥️? The Invisible Character That Turns a Symbol Into an Emoji

The difference between ♥ and ♥️ is one invisible character. U+FE0F, called variation selector 16, sits after the heart and asks for the colourful emoji picture. Its sibling U+FE0E, variation selector 15, asks for the plain text glyph instead. When neither is present, the app decides, and apps disagree. That is why the same heart can arrive red in one chat and black in the next, and why copying it sometimes seems to drop the colour.

We went through Unicode's own 18.0 data files and our 92 copy-and-paste symbol sets to count exactly how many characters lead this double life, which ones you are most likely to meet, and what the missing selector does to usernames, search and screen readers.

What U+FE0F and U+FE0E actually do

Neither selector draws anything. They are instructions attached to the character in front of them. Unicode's emoji standard, UTS #51 (revision 31, dated 28 August 2026), defines VS15 as the character "used to request a text presentation for an emoji character" and VS16 as the one "used to request an emoji presentation".

Note the word request. The same document says plainly that "presentation style is never guaranteed". A font that has no colour heart cannot obey VS16, and a phone that draws every heart in colour may ignore VS15. The selector is a strong hint, not an order.

Here is what each version contains, written as code points:

  • ♥ is one code point: U+2665 BLACK HEART SUIT.
  • ♥️ is two: U+2665 followed by U+FE0F.

Paste any of them into our emoji to code point converter and the selector shows up as its own line, which tells you at a glance which one you have. The emoji glossary has a short entry on variation selectors if you want the vocabulary.

219 characters can go either way by default

Every emoji carries a property called Emoji_Presentation. When it is No, the character is meant to look like ordinary text unless something asks otherwise. We counted that set in the Unicode 18.0 emoji-data.txt file.

  • 1,447 code points have the Emoji property at all.
  • 1,228 of them default to emoji presentation.
  • 219 default to text presentation. Those are the shape-shifters.
  • 12 of the 219 are the keycap bases: the digits 0 to 9, # and *. They are rarely seen as emoji alone and usually turn up inside keycaps.
  • That leaves 207 everyday symbols, from © to ☀ to 🕶, whose look depends on a selector.

Their ages explain a lot. 67 of the 207 were already in Unicode 1.1 (1993) or 3.0 (1999), years before anyone drew them as colour pictures; they were text first, and the text default protects old documents from suddenly sprouting cartoons. Another 94 arrived in Unicode 7.0 in 2014, including 🕶 sunglasses, 🌶 hot pepper and 🗺 world map. That surprises people, because those look like ordinary emoji in every keyboard. They are text-default characters that keyboards always send with U+FE0F attached.

The reverse case exists too. Unicode's emoji-variation-sequences.txt lists 371 characters that accept both selectors, so 152 characters that default to colour, such as ⌚ ⭐ ⚡ ✅ and the 24 clock faces, also have an official text form you can request with U+FE0E. Do not assume every font honours that direction; try it on your own devices first.

The dual-form characters you are most likely to paste

These are the text-default characters that show up most in bios, signatures and symbol pickers. Each line gives the code point, the official Unicode character name, the year the character itself entered Unicode, and the year it gained emoji status, from our catalog built on Unicode's emoji-test.txt.

  • ♥ U+2665 BLACK HEART SUIT: character 1993, emoji 2010.
  • ❤ U+2764 HEAVY BLACK HEART: 1993, emoji 2010. Its emoji form is the red heart.
  • ♀ U+2640 FEMALE SIGN and ♂ U+2642 MALE SIGN: 1993, but emoji only in 2016 (Emoji 4.0), when they became the building blocks for gendered emoji.
  • ☺ U+263A WHITE SMILING FACE: 1993, emoji 2010.
  • ☹ U+2639 WHITE FROWNING FACE: 1993, emoji 2014.
  • ✔ U+2714 HEAVY CHECK MARK and ☑ U+2611 BALLOT BOX WITH CHECK: 1993, emoji 2010.
  • ‼ U+203C DOUBLE EXCLAMATION MARK: 1993, emoji 2010. ⁉ U+2049: 1999, emoji 2010.
  • © U+00A9, ® U+00AE and ™ U+2122: 1993, emoji 2010. © and ® live in the Latin-1 block next to accented letters, so nearly every text font carries its own glyph for them.
  • ➡ U+27A1, ↩ U+21A9, ↔ U+2194 and ⬆ U+2B06 (arrows): emoji 2010.
  • ▶ U+25B6 and ◀ U+25C0, the play and reverse triangles: 1993, emoji 2010.
  • ♠ U+2660, ♣ U+2663, ♦ U+2666 (card suits): 1993, emoji 2010.
  • ☀ U+2600, ☁ U+2601, ❄ U+2744 (weather): 1993, emoji 2010.
  • ✂ U+2702, ✈ U+2708, ✉ U+2709, ✏ U+270F, ☎ U+260E: all 1993, all emoji 2010.
  • ⚠ U+26A0 WARNING SIGN: character 2003, emoji 2010.
  • ☮ U+262E and ☠ U+2620: 1993, emoji 2015. ☯ U+262F and ✝ U+271D: 1993, emoji 2014.
  • ♾ U+267E PERMANENT PAPER SIGN: character 2005, emoji 2018 as "infinity".
  • ⚧ U+26A7, the transgender symbol: character 2005, emoji 2020.

Look at ♾ and ⚧. Their character dates and emoji dates sit a decade or more apart, which is the whole story of this group: Unicode encoded the symbol for typesetting, then years later gave it a second, pictorial life.

Fully qualified, minimally qualified, unqualified

Unicode's emoji-test.txt sorts every emoji spelling into four buckets, and the counts make the selector's importance obvious. For version 18.0:

  • 3,963 fully-qualified entries. Every character that needs U+FE0F has it. This is what keyboards should send.
  • 1,029 minimally-qualified entries. The first character is fine, but a selector is missing further along.
  • 243 unqualified entries. The very first character lacks the selector it needs.
  • 9 components, such as the skin tone modifiers, that are not emoji on their own.

The 243 unqualified forms break down cleanly when you count them. 207 are the bare symbols from the previous section (♥ alone, ☀ alone). 12 are keycaps written without the selector between digit and keycap frame, the problem our guide to number keycaps pulls apart. The remaining 24 are joined sequences whose first part lacks it, such as ❤ joined to 🔥.

All 1,029 minimally-qualified entries are joined (ZWJ) sequences, and 700 of them contain ♀ or ♂ without its selector. Gendered professions and activities end in one of those two signs, so drop the invisible selector from the end and you have a minimally-qualified spelling. Of the 3,963 correct spellings, 1,180 contain at least one U+FE0F, and 46 need two.

UTS #51 asks keyboards to generate only fully-qualified joined sequences, and lets software treat the incomplete ones the same as the full form. Software that skips that courtesy is where a gendered profession can fall apart on screen, showing the person first and a loose ♀ beside it.

Why one app shows colour and the next shows black

Paste a bare ♥ and three things decide what you see: whether the app's main font has a heart glyph, whether the system prefers a colour emoji font for that code point, and whether the app overrides either choice. None of these is visible to you, and they differ by operating system, browser and even text field.

So the honest rule is about selectors, not apps. If a symbol needs to look the same everywhere, pin it with the right selector before you send it. If it arrives without one, you have handed the decision to whatever renders it.

Two quick checks tell you where you stand. First, paste the character into the converter linked above and see if a U+FE0F or U+FE0E line appears. Second, look at the colour: a symbol that follows your text colour and goes white in dark mode is being drawn as text, and one that keeps its own colours is being drawn as emoji.

How the colour gets lost between copy and paste

The clipboard normally copies the selector along with everything else, so a heart rarely loses colour in transit. It usually never had the selector in the first place. The common sources are:

  • Symbol lists and character maps, which show the bare code point because that is the character's identity.
  • Older documents and web pages written before 2010, when these characters had no emoji form at all.
  • Typing methods that produce the base character, such as Alt codes on Windows. Alt + 3 gives ♥ with no selector.
  • Filters that strip what they consider invisible characters from names or messages. If a field accepts ♥️ but you see a black heart afterwards, check whether the saved text still contains U+FE0F.

Note what UTS #51 says about the opposite direction: presentation selectors "should not be added to existing text without an explicit directive from the user." Well-behaved software will not quietly pin your heart for you, which is fair, because it cannot know which form you meant.

We audited our own symbol sets

Our symbol collection holds 2,739 copyable items across 92 sets. We checked each item against the 207 text-default symbols.

  • 270 items, 118 different characters, are bare text-default symbols. They will look like text in some apps and like emoji in others.
  • They appear in 56 of the 92 sets. Text symbols, weather, lightning and cross sets carry the most.
  • The most repeated are ❤ (in 8 sets), ♥ (7), ☀ and ☄ (6 each), then ⚜ ✒ ✝ ☯ ☪ ✴ (5 each).
  • Only 6 items are pinned to text with U+FE0E: ❤︎ ♥︎ ☂︎ ☁︎ ⛈︎ ✂︎. Five are pinned to emoji with U+FE0F, among them ♥️ and ✂️.

That bare majority is deliberate. A symbol set is supposed to give you the character itself, and pinning every item would remove your choice. But it does mean that ❤ copied from the heart symbol set can turn red on a phone and stay black on a laptop, and now you know why.

The same overlap runs the other way. 346 of our emoji pages link out to at least one symbol set, and for 129 of them the link exists because the emoji's bare text form is an item in that set. ♀ and ♂ are the standard case: a search for the female sign often wants the plain character from the gender symbols set, while the female sign emoji page covers ♀️.

Usernames, search and screen readers

The selector changes the string even when it does not change what you notice. We tested these in Node 25 and Python:

  • ♥ and ♥️ are not equal strings. An exact-match search for one will not find the other, and two handles that look the same can be different names.
  • Normalisation does not help. NFC and NFKC both leave U+FE0F in place.
  • Length grows. ♥ is 1 UTF-16 unit and 3 UTF-8 bytes; ♥️ is 2 units and 6 bytes. Both count as one grapheme to Intl.Segmenter.
  • JavaScript's \p{RGI_Emoji} regex matches ♥️ but not a bare ♥, so code that hunts for emoji with that pattern skips the text form entirely.

For usernames, the safest choice depends on the platform. If a username field rejects emoji, the bare character may still get through, because to the filter it is an older text symbol. Our username symbols page leans on that. If a platform keeps rejecting the name, try removing any selector before giving up on the symbol.

Screen readers are kinder. The CLDR annotation data that most of them draw on is keyed without selectors (our screen reader name list strips U+FE0F before looking a name up for that reason), so both forms are generally announced by the same name. Developers dealing with lengths and regexes will find the full measurements on our emoji page for developers.

Forcing the form you want

The simplest method is to copy a version that already carries the selector. These are pinned, so what you paste is what you send:

Text form:  ♥︎ ❤︎ ♀︎ ♂︎ ☺︎ ✔︎ ‼︎ ☀︎ ✈︎ ⚠︎
Emoji form: ♥️ ❤️ ♀️ ♂️ ☺️ ✔️ ‼️ ☀️ ✈️ ⚠️

To add a selector by hand:

  1. Microsoft Word: after the symbol, type FE0F or FE0E, select those four characters and press Alt + X. Microsoft's support article on inserting Unicode characters documents the Alt + X conversion and the select-first approach.
  2. HTML: write the numeric reference after the character, for example ♥︎ for a text heart.
  3. JavaScript or JSON: use the escape \u2665\uFE0F for an emoji heart.
  4. CSS: the font-variant-emoji property accepts text or emoji and acts as if the matching selector were present. MDN currently marks it as not Baseline, meaning some major browsers do not support it yet, so treat it as a progressive extra rather than a fix.

The Microsoft page is "Insert ASCII or Unicode Latin-based symbols and characters" on support.microsoft.com, and the MDN entry is the font-variant-emoji reference; both were checked on 22 October 2026.

Which form to use where

Pick the text form when the symbol sits inside text and should behave like text: a ♥ between two words of a signature, ✔ in a document checklist, © in a footer, an arrow in instructions. It takes your font, size and colour, and it will not balloon into a picture next to small type.

Pick the emoji form when the symbol is the message. A reply that is just ❤️, a ☀️ in a weather update, ✈️ at the start of a travel post. Here the colour carries the meaning, and leaving it to chance means some readers get a thin black outline instead.

For the full spread of hearts, the heart emoji category covers the colour versions and our text heart symbol list covers the plain ones. Ticks and arrows get the same treatment in the check mark, arrow and star symbol guide. And if two emoji look alike but are not the same character at all, rather than the same character in two dresses, that is a different problem, covered in why some emoji look like duplicates.

Frequently Asked Questions

What is the difference between ♥ and ♥️?+

They are the same character, U+2665, but ♥️ adds the invisible U+FE0F (variation selector 16), which requests the colour emoji picture. Without it the app chooses, so a bare ♥ may appear as black text on one device and as an emoji on another.

What does U+FE0E do?+

U+FE0E is variation selector 15. Placed after a symbol that has both forms, it asks for the plain text glyph instead of the emoji, so ♥︎ follows your font colour. Unicode calls this a request: a device that only has a colour glyph may still show colour.

How many symbols have both a text and an emoji form?+

In Unicode 18.0, 371 characters accept both selectors. 219 of them default to text, including the 12 keycap bases and 207 everyday symbols like ©, ☀ and ♀, and 152 default to emoji but have an official text form, such as ⌚ and ⭐.

Why does my heart turn black when I paste it?+

Usually because the heart you copied never had U+FE0F attached, so the app you pasted into chose its text glyph. Paste it into a code point converter: if no FE0F line appears, copy a pinned ❤️ instead, or add the selector yourself.

What does unqualified emoji mean?+

It is Unicode's term for an emoji spelled without a selector its first character needs, such as a bare ☀. Unicode 18.0 lists 243 of them: 207 single symbols, 12 keycaps and 24 joined sequences. Keyboards are expected to send the fully-qualified form instead.

Do ♀ and ♀️ count as the same username?+

Not as strings. The emoji version contains an extra code point, so exact matching treats them as different and Unicode normalisation does not merge them. Whether a platform considers the two handles identical depends on its own rules, so test before relying on either.

About BestEmojis Team

The Best Emojis team is dedicated to helping you find the perfect emojis for every occasion. We provide comprehensive guides, tips, and a vast collection of free emojis for all your communication needs.

More from Our Blog