Matching emojis (tap to copy)
Nicknames shared by visitors
🆕 Just added for
Share your own nickname
Fancy text works because every styled letter is a separate Unicode character, not a font: 𝓡 is U+1D4E1 MATHEMATICAL BOLD SCRIPT CAPITAL R, not plain R. Your phone draws it with whichever installed font contains it, in Instagram, TikTok or any text box. Unicode 18.0, released 16 September 2026, defines 172,808 characters.
How does fancy text work?
Fancy text is plain text made of unusual characters. A fancy text generator swaps each letter you type for a look-alike character that Unicode already defines — a mathematical script letter, a fullwidth letter, a circled letter — and the result stays styled wherever it is pasted because the style lives in the characters themselves.
Three words explain almost everything on this page, and they are easy to mix up:
- A code point is the number Unicode assigns to one character, written U+ followed by hexadecimal digits. U+0052 is LATIN CAPITAL LETTER R; U+1D4E1 is MATHEMATICAL BOLD SCRIPT CAPITAL R.
- A glyph is the drawing of a character: the actual curves you see. One code point can have thousands of glyphs, one in every font that supports it.
- A font is a file that maps code points to glyphs. It decides how 𝓡 looks, but it cannot turn R into 𝓡 — that change has to happen in the text.
That is the whole trick behind a stylish nickname. Bold on a website is formatting applied to ordinary letters; bold in a display name is a different set of letters. The Unicode data file even says so: in UnicodeData.txt, published by the Unicode Character Database, U+1D4E1 carries the decomposition tag <font> 0052, which means “a font variant of R, kept as its own character”.
| Shown | Code point | Unicode name | Tag | UTF-16 units | UTF-8 bytes | NFKC gives | What it is |
|---|---|---|---|---|---|---|---|
| A | U+0041 | Latin Capital Letter A | (none) | 1 | 1 | A | the ordinary letter |
| 𝐀 | U+1D400 | Mathematical Bold Capital A | <font> | 2 | 4 | A | maths bold |
| 𝓐 | U+1D4D0 | Mathematical Bold Script Capital A | <font> | 2 | 4 | A | maths bold script |
| A | U+FF21 | Fullwidth Latin Capital Letter A | <wide> | 1 | 3 | A | fullwidth, from East Asian typing |
| Ⓐ | U+24B6 | Circled Latin Capital Letter A | <circle> | 1 | 3 | A | circled |
| ᴀ | U+1D00 | Latin Letter Small Capital A | (none) | 1 | 3 | ᴀ | phonetic small capital |
The tag column is the reason fancy text can be undone. Characters tagged <font>, <wide> or <circle> are declared variants of a plain letter, so compatibility normalisation (explained below) folds them back to A. The small capital ᴀ has no tag: Unicode treats it as a letter in its own right, which is why it survives.
What does a fancy text generator actually do?
A fancy text generator is a lookup table. For most styles the styled alphabet sits in one continuous run of code points, so the tool adds a fixed offset to each letter’s position: bold script capitals start at U+1D4D0, so R, the 18th letter, becomes U+1D4D0 + 17 = U+1D4E1. Fullwidth letters are simpler still — every ASCII letter plus 0xFEE0.
| Style | Capital A starts at | Small a starts at | Result | Code points |
|---|---|---|---|---|
| Bold script | U+1D4D0 | U+1D4EA | 𝓡𝓲𝔂𝓪 | U+1D4E1 U+1D4F2 U+1D502 U+1D4EA |
| Fullwidth | U+FF21 | U+FF41 | Riya | U+FF32 U+FF49 U+FF59 U+FF41 |
| Circled | U+24B6 | U+24D0 | Ⓡⓘⓨⓐ | U+24C7 U+24D8 U+24E8 U+24D0 |
| Maths bold | U+1D400 | U+1D41A | 𝐑𝐢𝐲𝐚 | U+1D411 U+1D422 U+1D432 U+1D41A |
Some alphabets have holes where a letter was already encoded elsewhere, so a good generator patches them from other blocks. The nickname font style library maps all 21 SnapNick styles to their blocks, gaps and character cost, so this page stays on the mechanism rather than repeating that table.
Try it: build a stylish name one Unicode layer at a time
A decorated name is built in layers, and each layer adds characters you may not see. Copy any stage below and paste it into a notes app; the table shows what each layer adds, measured with two independent grapheme splitters that returned identical counts.
| # | Layer | Text | What was added | Graphemes | Code points | UTF-16 | UTF-8 bytes |
|---|---|---|---|---|---|---|---|
| 1 | Plain letters | Riya | four Basic Latin letters | 4 | 4 | 4 | 4 |
| 2 | Styled letters | 𝓡𝓲𝔂𝓪 | four maths letters from outside the BMP | 4 | 4 | 8 | 16 |
| 3 | + combining marks | 𝓡͜͡𝓲𝔂𝓪 | U+035C and U+0361, stacked on 𝓡 | 4 | 6 | 10 | 20 |
| 4 | + frame symbols | ꧁𝓡͜͡𝓲𝔂𝓪꧂ | U+A9C1 and U+A9C2, Javanese punctuation | 6 | 8 | 12 | 26 |
| 5 | + emoji with FE0F | ꧁𝓡͜͡𝓲𝔂𝓪꧂❤️ | U+2764 heart + U+FE0F emoji selector | 7 | 10 | 14 | 32 |
| 6 | + ZWJ sequence | ꧁𝓡͜͡𝓲𝔂𝓪꧂❤️🔥 | U+200D joiner + U+1F525 fire | 7 | 12 | 17 | 39 |
Two things stand out. The name looks four letters long in layer 2 but already costs 8 UTF-16 units, because each maths letter lives outside the Basic Multilingual Plane. And in layer 6 the heart and fire merge into one picture, so seven visible characters are really twelve code points.
Want the individual building blocks? Each button below copies a single combining mark or joiner on its own. Paste it straight after a letter and it attaches to that letter; pasted alone, most apps show it on a dotted circle.
What is inside real stylish names?
Most decorated names use more than styled letters. We ran every one of the 11,223 unique strings in the SnapNick item library (names, symbols, kaomoji and emoji combos, as filtered on 16 September 2026) through Python’s unicodedata module and the regex module’s grapheme splitter. 61.0% contain a character outside the Basic Multilingual Plane, and in 33.1% the visible character count differs from the code point count.
| Feature | Strings | Share |
|---|---|---|
| At least one character outside the BMP (2 UTF-16 units each) | 6,841 | 61.0% |
| Visible characters ≠ code points | 3,711 | 33.1% |
| Changed by NFKC normalisation | 3,356 | 29.9% |
| A combining mark (variation selectors not counted) | 1,906 | 17.0% |
| Variation selector-16 (U+FE0F) | 1,052 | 9.4% |
| Maths alphanumeric letters (U+1D400–U+1D7FF) | 984 | 8.8% |
| Two or more marks stacked on one base | 781 | 7.0% |
| Variation selector-15 (U+FE0E) | 475 | 4.2% |
| Zero width joiner (U+200D) | 263 | 2.3% |
| Fullwidth letters or punctuation | 81 | 0.7% |
| A bidi control such as U+200E | 57 | 0.5% |
| Changed by NFC normalisation | 23 | 0.2% |
The most common combining marks were not the famous ◌͜ and ◌͡ from the Lenny face. They were two Tibetan vowel signs, U+0F80 and U+0F72, found 371 and 369 times, usually typed together as ◌ྀི under an emoji to add a small sparkle. The longest single visible character we found stacks 21 code points on one Thai letter.
Why does fancy text survive copy and paste?
Fancy text survives copy and paste because the clipboard carries characters, and the styling is part of the characters. Formatting such as bold or italic applied in an editor is stored separately from the text, so a plain-text box like a profile name field drops it on paste — but 𝐑𝐢𝐲𝐚 is four different letters, so nothing is lost.
Try it with the pair below. Paste plain Riya into a document, make it bold, then copy that bold word into a WhatsApp or Instagram name field: the bold disappears. Paste 𝐑𝐢𝐲𝐚 instead and it stays bold, because the characters are all that needs to travel.
The same property explains the limits. Fancy text only works where a field accepts any Unicode letter. Usernames and handles usually accept a short list — TikTok usernames, for example, allow letters, numbers, underscores and periods, per TikTok Support — so styled letters belong in the display name instead.
What is font fallback, and why do some letters come from a different font?
Font fallback is the process a phone or browser uses when the main font has no glyph for a character: it walks down a list of other installed fonts until one does. A stylish name is often drawn by three or four fonts at once, and if no installed font has the character, you see an empty box instead.
We measured this with fontconfig on a Linux test server holding 2,211 font faces. For each code point in the layer-6 name we counted the faces that contain it and asked the system which font it would pick:
| Characters | Code points | Faces with a glyph | Font chosen |
|---|---|---|---|
| 𝓡 𝓲 𝔂 𝓪 | U+1D4E1 and three more | 4 | Noto Sans Math |
| R i y a (plain, for comparison) | U+0052 and three more | 373 | DejaVu Sans |
| ꧁ ꧂ | U+A9C1, U+A9C2 | 4 | Noto Sans Javanese |
| ͜ ͡ (marks) | U+035C, U+0361 | 214 and 233 | DejaVu Sans |
| ❤ with FE0F | U+2764, U+FE0F | 28 and 23 | DejaVu Sans |
| Zero width joiner | U+200D | 1,467 | DejaVu Sans |
| 🔥 fire | U+1F525 | 0 | none — shown as a box |

A server is not a phone, but the pattern carries over. Android and iOS ship far larger fallback lists than a bare Linux machine, which is why the same name usually shows in full on a recent phone. The risk sits with rare blocks and brand-new characters: an older device may simply have no font for them. It also explains why a decorated name can look uneven — the maths letters and the Javanese brackets were designed by different people for different fonts.
If one symbol in a name keeps turning into a box, swap that symbol rather than the whole name. The nickname symbols collection lists the Unicode version each common symbol was added in, which is a quick way to spot the risky ones.
How do combining marks stack on a letter?
A combining mark is a character with no space of its own that attaches to the character before it. Unicode gives each mark a general category (Mn for non-spacing, Me for enclosing) and a combining class number that tells the renderer where it sits, which is how ◌͜ and ◌͡ can pile onto one letter without moving the next one.
| Shown | Code point | Unicode name | Category | Combining class | Behaviour |
|---|---|---|---|---|---|
| ◌͜ | U+035C | Combining Double Breve Below | Mn | 233 | combining, non-spacing |
| ◌͡ | U+0361 | Combining Double Inverted Breve | Mn | 234 | combining, non-spacing |
| ◌᷍ | U+1DCD | Combining Double Circumflex Above | Mn | 234 | combining, non-spacing |
| ◌̫ | U+032B | Combining Inverted Double Arch Below | Mn | 220 | combining, non-spacing |
| ◌̥ | U+0325 | Combining Ring Below | Mn | 220 | combining, non-spacing |
| ◌⃝ | U+20DD | Combining Enclosing Circle | Me | 0 | combining, enclosing |
| ◌ི | U+0F72 | Tibetan Vowel Sign I | Mn | 130 | combining, non-spacing |
| ꧁ | U+A9C1 | Javanese Left Rerenggan | Po | 0 | not a mark — stands alone |
Three details matter for names. Double marks such as U+035C, U+0361 and U+1DCD are drawn across two letters, which is how R͜͡i gets its arc. Combining class 233 sits below and 234 above, so the order you type them in does not change the result after canonical ordering. And ꧁ and ꧂ are not marks at all: they are Javanese punctuation (category Po), each a full character with its own width.
Whether stacks look right depends on the font’s mark-positioning data. When the chosen font has no anchor for a mark on that particular base letter, the renderer guesses a position, so a mark can drift or collide in one app and sit neatly in another — the character is the same, only the drawing differs.
Kaomoji built on combining marks
Every kaomoji below uses at least one combining mark for its mouth, nose or tears. Copy one and count it: each looks shorter than it is.
Symbols inside enclosing marks
Enclosing marks draw a circle (U+20DD), diamond (U+20DF) or triangle (U+20E4) around the character before them. Fonts rarely size the frame to fit an emoji, so the outline often looks off-centre — a rendering choice, not a broken copy.
The last item, ͙͘͡★, shows the opposite case: its three marks come before the star, with no base character to sit on, so Unicode counts them as a separate cluster and many apps draw them on their own.
What does the variation selector FE0F do to a symbol?
U+FE0F, VARIATION SELECTOR-16, asks for the colourful emoji version of the character right before it, and U+FE0E, VARIATION SELECTOR-15, asks for the plain text version. They only work on characters listed in emoji-variation-sequences.txt: Unicode 18.0 lists 371 such characters, and adding FE0F to anything else changes nothing.
| Shown | Sequence | Has emoji/text styles | Code points | UTF-16 | Effect |
|---|---|---|---|---|---|
| ❤ | U+2764 | yes | 1 | 1 | no selector: the app decides |
| ❤︎ | U+2764 U+FE0E | yes | 2 | 2 | text style requested |
| ❤️ | U+2764 U+FE0F | yes | 2 | 2 | emoji style requested |
| ⭐ | U+2B50 | yes | 1 | 1 | already emoji by default |
| ⭐︎ | U+2B50 U+FE0E | yes | 2 | 2 | text style requested |
| ♡ | U+2661 | no | 1 | 1 | no emoji version exists |
| ♡️ | U+2661 U+FE0F | no | 2 | 2 | FE0F ignored: ♡ is not in the list |
| ∞︎ | U+221E U+FE0E | no | 2 | 2 | FE0E ignored: ∞ is not in the list |
In names this has two practical effects. First, a heart copied without FE0F may appear as a small black ❤ in one app and a red emoji in another, because each app picks its own default. Second, FE0F is an extra character: 9.4% of the strings in our library carry one, and some carry it where it does nothing. The symbols below come in both flavours so you can compare them side by side; ∞︎ and ◆︎ carry a selector that does nothing, and ☀︎︎ carries FE0E twice, where only the first belongs to a defined sequence.
How do emoji ZWJ sequences join two emoji into one?
An emoji ZWJ sequence is two or more emoji glued together with U+200D ZERO WIDTH JOINER, which a supporting font draws as one new picture. ❤️🔥 heart on fire is ❤ + FE0F + ZWJ + 🔥. The file emoji-zwj-sequences.txt for Emoji 18.0 lists 1,614 recommended sequences that vendors are expected to support.
| Shown | Name | Code points | Recommended | Graphemes | UTF-16 | UTF-8 bytes | Look without support |
|---|---|---|---|---|---|---|---|
| ❤️🔥 | heart on fire | U+2764 U+FE0F U+200D U+1F525 | yes | 1 | 5 | 13 | ❤️ 🔥 |
| 🐻❄️ | polar bear | U+1F43B U+200D U+2744 U+FE0F | yes | 1 | 5 | 13 | 🐻 ❄️ |
| 🍄🟫 | brown mushroom | U+1F344 U+200D U+1F7EB | yes | 1 | 5 | 11 | 🍄 🟫 |
| ⛓️💥 | broken chain | U+26D3 U+FE0F U+200D U+1F4A5 | yes | 1 | 5 | 13 | ⛓️ 💥 |
| 🐱👤 | ninja cat (not in the list) | U+1F431 U+200D U+1F464 | no | 1 | 5 | 11 | 🐱 👤 |
| 🦄🪽 | unicorn + wing (not in the list) | U+1F984 U+200D U+1FABD | no | 1 | 5 | 11 | 🦄 🪽 |
| 🔗💥 | link + collision (not in the list) | U+1F517 U+200D U+1F4A5 | no | 1 | 5 | 11 | 🔗 💥 |
The last three rows are the interesting ones. A device that does not know a sequence draws the parts side by side, yet text counters still treat the whole thing as one character, because the grapheme rules in Unicode Standard Annex #29 join any emoji + ZWJ + emoji pair whether or not a picture exists (rule GB11). So 🦄🪽 may show as two emoji and still count as one. Emoji rules themselves are defined in Unicode Technical Standard #51.
These ZWJ combos come from the SnapNick library. A few mix a sequence with marks or symbols, and one — the headphones in brackets — has a joiner that joins nothing, so it has no visible effect.
Why do apps count the characters in a stylish name differently?
Apps count characters differently because “character” can mean four units: grapheme clusters (what you see), code points (what Unicode numbers), UTF-16 code units (what JavaScript, Java and Android store) or UTF-8 bytes (what many databases limit). A stylish name can be 7 of the first and 39 of the last.
- A grapheme cluster is one user-perceived character: a base plus any marks, selectors and joined emoji, as defined in UAX #29. JavaScript’s
Intl.Segmenterand Swift’sString.countcount these. - A code point is one Unicode character. Python’s
len()counts code points. - A UTF-16 code unit is 16 bits; characters above U+FFFF take two. JavaScript’s
.lengthcounts these. - A UTF-8 byte is 8 bits; one character takes 1 to 4. Byte limits in databases and APIs count these.

| Text | Graphemes | Code points | UTF-16 units | UTF-8 bytes |
|---|---|---|---|---|
| ⚡𝗥𝗶𝘆𝗮⚡ | 6 | 6 | 10 | 22 |
| — K a v y a | 11 | 11 | 11 | 21 |
| ˚₊· 𝕍𝕚𝕙𝕒𝕒𝕟 ·₊˚ | 14 | 14 | 20 | 40 |
| ζ͜͡𝕲𝖍𝖔𝖘𝖙 | 6 | 8 | 13 | 26 |
| Sᴡꫝᴘɴɪ᪻ͥᷱ᷍ʟ ᥫ᭡ | 14 | 18 | 18 | 40 |
| ( ͡° ͜ʖ ͡°) | 8 | 11 | 11 | 17 |
| 🐻❄️ | 1 | 4 | 5 | 13 |
| ༄˖°.🍋🟩.ೃ࿔*:・ | 10 | 13 | 15 | 31 |
For a name field with a limit, the UTF-16 column is usually the safe number to plan with, because it is never smaller than the visible or code point count. Official help pages rarely say which unit they use: the WhatsApp Help Center gives a 25-character profile name without defining a character, so a name that fits by eye can still be cut.
Styled names to test in a counter
These names come straight from the SnapNick engine for Riya, Kavya and Vihaan, plus three decorated names from the library. Paste a few into any character counter and compare its number with the table.
How does Unicode normalization change search and duplicate checks?
Unicode normalization rewrites text into a standard form so that strings which mean the same thing compare as equal. Unicode Standard Annex #15 defines four forms: NFC and NFD handle true duplicates such as é, while NFKC and NFKD also fold compatibility variants — including most fancy letters — back to plain ones.
| Text | Code points | Same as the other form as typed? | Same after NFC? |
|---|---|---|---|
| é (e + combining acute) | U+0065 U+0301 | no | yes |
| é (precomposed) | U+00E9 | no | yes |
| Name | Lowercase match | NFC match | NFKC match | NFKC result |
|---|---|---|---|---|
| Riya | yes | yes | yes | Riya |
| 𝓡𝓲𝔂𝓪 | no | no | yes | Riya |
| 𝐑𝐢𝐲𝐚 | no | no | yes | Riya |
| Riya | no | no | yes | Riya |
| Ⓡⓘⓨⓐ | no | no | yes | Riya |
| ʀɪʏᴀ | no | no | no | ʀɪʏᴀ |
| 🅁🄸🅈🄰 | no | no | yes | RIYA |
The pattern is clear: plain lowercasing and NFC never find a styled name, while NFKC finds every style tagged as a variant. Small capitals do not fold, so ʀɪʏᴀ stays unfindable by typing riya. In our library NFC changed only 23 strings, while NFKC changed 3,356 (29.9%). Apps do not publish whether they normalise names before search or duplicate checks, so treat this as what the characters allow, not a promise about any one app; the font style guide has the result for all 21 styles.
What are bidi marks, and why can a name flip direction?
Bidi marks are invisible characters that steer the Unicode Bidirectional Algorithm, the rules in Unicode Standard Annex #9 that order left-to-right and right-to-left text on one line. Every character has a bidi class: Latin letters are strong left-to-right, Arabic and Urdu letters strong right-to-left, and most symbols neutral, taking their direction from neighbours.
| Shown | Code point | Unicode name | Bidi class | Mirrored | Effect |
|---|---|---|---|---|---|
| R | U+0052 | Latin Capital Letter R | L | no | fixes direction as left-to-right |
| ꧁ | U+A9C1 | Javanese Left Rerenggan | L | no | a decorative bracket that is strongly left-to-right |
| ♡ | U+2661 | White Heart Suit | ON | no | follows the text around it |
| ( | U+0028 | Left Parenthesis | ON | yes | neutral and mirrored: flips in right-to-left text |
| ◌͜ | U+035C | Combining Double Breve Below | NSM | no | takes the class of its base letter |
| (invisible) | U+200E | Left-To-Right Mark | L | no | an invisible character that counts as left-to-right |
| (invisible) | U+200F | Right-To-Left Mark | R | no | an invisible character that counts as right-to-left |
| (invisible) | U+202E | Right-To-Left Override | RLO | no | forces what follows to display right-to-left |
| (invisible) | U+2068 | First Strong Isolate | FSI | no | fences off a name from the text around it |
For names this matters in two ways. When a Latin nickname sits next to Urdu or Arabic text, neutral symbols at the edges can jump to the other side; putting U+200E after a left-to-right name, or wrapping it in an isolate, keeps the frame where you placed it. And the override U+202E can make text display backwards, which is why many platforms strip it — we do not include it in any copy item. In our library 57 strings (0.5%) carry a bidi control, almost always a harmless U+200E. The items below each hide one.
Where does fancy text fail?
Fancy text fails in five predictable places, all caused by the mechanisms above rather than by a bad copy:
- Usernames and handles. These fields accept a fixed set of plain characters, so styled letters are refused or stripped.
- Older or minimal devices. No font for a rare block means an empty box; no support for a new ZWJ sequence means two emoji side by side.
- Character limits. Limits counted in UTF-16 units or bytes fill two to four times faster with maths letters and emoji.
- Search. Without NFKC, a styled name cannot be found by typing it plainly; with NFKC, small capitals still cannot.
- Screen readers. Assistive software may read maths letters one by one or by their long Unicode names, so a styled display name can be hard to follow for someone listening.
Blank-looking characters have their own traps — some are removed by trim() and some are not — and the invisible name guide measures each one.
How do you make a stylish name that shows correctly almost everywhere?
Build the name from the fewest, most widely supported layers, then check it on a second device. These five steps take about two minutes with the tool at the top of this page.
- Type your name into the generator. Enter the name in the SnapNick nickname generator and pick a style. Styles whose letters all come from one block, such as bold script, look more even than styles that borrow letters.
- Add one frame, not three. A pair like ꧁ ꧂ or ♡ ♡ adds 2 to 4 UTF-16 units. Each extra layer adds characters and another font to fall back on.
- Prefer long-standing emoji. A single emoji with FE0F shows almost everywhere. Newer ZWJ sequences look great on recent phones but split into two pictures on older ones.
- Count by the strictest unit. Check the UTF-16 length before pasting into a field with a limit; if it fits in UTF-16, it fits by any other count.
- Paste, then look from another phone. Save the name and view your profile from a different device or app. Keep a plain version for your username and for search.
How did we measure all this?
Every number on this page was produced in code on 16 September 2026, not copied from another source. Grapheme counts come from Node.js 22 Intl.Segmenter (ICU 78.2, Unicode 17.0 data) and were cross-checked against the Python 3.11 regex module’s \X pattern — the two agreed on every string. Code points, UTF-16 and UTF-8 lengths and normalisation used Python’s unicodedata. Character names, categories, combining classes and bidi classes were read from UnicodeData.txt for Unicode 18.0, emoji data from the Emoji 18.0 files on unicode.org, and font coverage from fontconfig. Nothing here was tested inside a logged-in app.
Questions about how fancy text works
How do fancy text generators work?
A fancy text generator replaces each letter you type with a look-alike Unicode character from another block, usually by adding a fixed offset to the letter’s position. Bold script R, for example, is U+1D4D0 + 17 = U+1D4E1. No font is involved, so the result pastes anywhere that accepts Unicode.
How do fancy letters work?
Fancy letters are separate characters that Unicode encoded for maths, East Asian typing or phonetics, such as MATHEMATICAL BOLD SCRIPT CAPITAL R or FULLWIDTH LATIN CAPITAL LETTER R. Your device draws them with any installed font that contains them, which is why they look styled in apps that only allow plain text.
Is fancy text a font?
No. A font changes how the same characters are drawn; fancy text changes the characters. That is why a styled name keeps its look after copy and paste, and why it can show as an empty box on a device with no font for those characters.
Is it OK to use fancy text?
It is fine for display names, bios and captions where the app accepts Unicode. Avoid it for usernames, anything people need to search for, and text that must be read by screen readers, since assistive software may read styled letters oddly.
Does fancy text work with emojis?
Yes. Emoji are Unicode characters too, so they mix freely with styled letters. Joined emoji use U+200D ZERO WIDTH JOINER; on a device that does not know the combination, the parts appear side by side but still count as one character.
Why does a stylish name have more characters than I see?
Because counters measure different units. Maths letters take two UTF-16 units each, combining marks and variation selectors add invisible code points, and one joined emoji can be four or more code points. The layer-6 name on this page is 7 visible characters but 17 UTF-16 units.
Type a keyword and get styled variants you can copy straight into your profile.