♥ vs ❤ vs ♡: why some hearts turn red on their own
♥ (U+2665) is the card-suit heart and stays the colour of your text. ❤ (U+2764) is a dingbat that most platforms render as a red emoji. ♡ (U+2661) is the outlined card suit. If a heart changed colour without you asking, you have U+2764.
Last checked 2026-08-05.
At a glance
| Character | Code point | Name | HTML | When it is correct |
|---|---|---|---|---|
| ♥ | U+2665 | Black Heart Suit | ♥ | The default text heart. Inherits your font colour on essentially every platform. |
| ♡ | U+2661 | White Heart Suit | ♡ | The outlined version of the same card suit. Quieter, also colour-neutral. |
| ❤ | U+2764 | Heavy Black Heart | ❤ | The character behind the red heart emoji. Expect colour unless you force otherwise. |
| ❥ | U+2765 | Rotated Heavy Black Heart Bullet | ❥ | A decorative bullet, not a heart for prose. Usually stays monochrome. |
Card suits and dingbats are two different families
U+2665 and U+2661 come from the playing-card suit block, alongside the spade, the club and the diamond. They were encoded as text characters for card games and for typesetting, and no platform defines an emoji presentation for them. That is why they behave like letters: your colour, your size, your font.
U+2764 comes from the dingbat block, a set of printers' ornaments. It later acquired an emoji presentation, which is how it became the red heart everyone recognises from messaging apps. The character itself is still a plain black heart; the redness is a rendering decision made by the platform.
The invisible character that decides the colour
Unicode has two invisible characters whose only job is to tell the renderer which presentation you want. Variation selector 16, U+FE0F, requests the emoji form. Variation selector 15, U+FE0E, requests the plain text form. They carry no width and draw nothing themselves.
A heart copied from a messaging app often arrives with U+FE0F attached, which is why it stays red when you paste it somewhere that would otherwise have shown black. A heart copied from a plain text source arrives without one, and then each platform picks its own default, which is why the same character can look different in three applications on the same machine.
If you need one specific appearance, append the selector explicitly and test it where it will actually be read. If you just want a heart that never surprises you, use U+2665.
Usernames, bios and captions
Many services allow text characters in a display name but strip or reject emoji, and the two hearts behave differently under that rule even though they look alike. The card-suit hearts are ordinary symbol characters and usually pass. U+2764 with a variation selector is frequently treated as an emoji and rejected.
The same split shows up in sorting, in search and in anything that indexes text. If a heart is part of an identifier rather than decoration, the card suit is the safer character by a wide margin.
The emoji hearts are separate characters again
The coloured hearts beyond red, such as the blue, yellow and black ones, are not variants of any of the characters above. They are their own code points in a different block, added much later, and they have no monochrome text form at all. A system that cannot render them shows an empty box rather than falling back to a plain heart.
That is worth knowing before you use one in anything that has to survive an export, a plain text email or an older device.
Frequently asked questions
How do I stop my heart from turning red?
Use U+2665, the card-suit heart, or append the text variation selector U+FE0E after U+2764. Without an explicit selector each platform picks its own default.
Which heart works in a username?
U+2665 or U+2661. They are ordinary symbol characters rather than emoji, so services that reject emoji usually accept them.
Is ❤ an emoji?
The character is a dingbat with an emoji presentation available. Whether you see the emoji depends on the platform and on whether a variation selector is present.