The problem: there is no bold in plain text, only a different character that looks bold
Social media platforms do not let you type bold or italic in a post. Instagram bios, Twitter posts, TikTok captions, Facebook updates — these all render as plain text. You cannot highlight a word and click Bold, because there is no bold. The platform stores the characters you type, and it displays those characters in whatever font it uses. There is no formatting layer.
People who want bold or italic on these platforms have found a workaround, and the workaround is Unicode. Unicode is the standard that assigns a number to every character in every writing system. The Latin letter A is U+0041. The mathematical bold capital A is U+1D400. They look similar — 𝐀 and A — but they are different characters. They have different code points, they are stored as different bytes, and they render in different fonts. When you paste U+1D400 into Instagram, Instagram does not know it is "supposed to be" a bold A. It just sees a character and renders it in whatever font it has for that character.
A text formatter for social media works by taking your plain ASCII input and swapping each letter for its Unicode lookalike. Type "hello," pick Bold Serif, and the tool swaps each letter for the corresponding character in the Mathematical Alphanumeric Symbols block. The output is "𝐡𝐞𝐥𝐥𝐨" — five characters that look bold, but are actually five different characters from a Unicode block designed for mathematical notation, not for social media bios.
This is the first thing to understand about these tools. They do not apply formatting. They swap characters. The "bold" is a different letter. The "italic" is a different letter. The "circled" is a different letter. The "strikethrough" is the same letter with a combining mark stacked on top of it. None of these are styling. All of them are Unicode substitution.
The Text Formatter for Social does this substitution in your browser, with 27 styles and 8 decorators. It is the right tool for what it does, and the limits it has are the limits of the Unicode-substitution approach, not bugs in the tool. Knowing those limits is what makes the difference between text that looks good and text that shows up as boxes or breaks the platform's character counter.
Fastest path
Open the Text Formatter for Social. Type or paste your text into the input. Scroll the style grid — Bold Serif, Bold Sans, Italic Serif, Script, Fraktur, Double-Struck, Circled, Squared, Fullwidth, Small Caps, Superscript, Upside Down, Strikethrough, Underline, Wavy, Bubble, Aesthetic, Zalgo Light, Zalgo Heavy, and a few more. Click a style. The output appears in a copy card. Click Copy. Paste into the platform. Optionally pick a decorator (Sparkles, Stars, Arrows, Brackets) to wrap the output in a border of decorative symbols.
The four mechanisms, and how each one works
Every Unicode text formatter uses one of four mechanisms to transform text. Knowing which one a style uses tells you what its failure modes will be.
Lookup-table replacement is the most common. The tool keeps two strings — a normal alphabet (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz) and a target alphabet (the Mathematical Alphanumeric Symbols for bold, the Enclosed Alphanumerics for circled, the IPA Extensions for upside-down). For each character in your input, the tool finds its position in the normal alphabet and substitutes the character at the same position in the target alphabet. Characters not in the normal alphabet (spaces, punctuation, emoji, accented characters, CJK) pass through unchanged. This is how Bold Serif, Bold Sans, Italic, Script, Fraktur, Double-Struck, Circled, Squared, Small Caps, and Upside Down all work.
Arithmetic code-point shift is simpler. The tool takes each character's code point and adds a fixed offset. Fullwidth text works this way: every ASCII character from U+0021 to U+007E is shifted by +65248 (0xFF00), landing in the Halfwidth and Fullwidth Forms block from U+FF01 to U+FF5E. The output looks like wide, spaced-out text. The space character (U+0020) is excluded and passes through.
Combining-mark insertion is how strikethrough, underline, wavy, bubble, and Zalgo text work. A combining mark is a special Unicode character that is not a letter by itself — it is a modifier that stacks on top of, under, or around the preceding character. Strikethrough appends U+0336 (COMBINING LONG STROKE OVERLAY) after each character. The renderer draws a horizontal line through each character. Underline appends U+0332 (COMBINING LOW LINE). Wavy appends U+0334 (COMBINING TILDE OVERLAY). Bubble text appends U+20DD (COMBINING ENCLOSING CIRCLE), which wraps each character in a circle. Zalgo stacks many combining marks per character, drawn above and below, producing the cursed text meme.
Character reversal is how upside-down text works. The tool reverses the string character by character, then substitutes each character with its upside-down Unicode equivalent from the IPA Extensions and Miscellaneous blocks. The output reads right-to-left and upside-down. This is also the only mechanism that changes the order of the characters, not just their shape.
Why digits do not work in most styles
The Mathematical Alphanumeric Symbols block — the block that gives us bold, italic, script, fraktur, and double-struck letters — defines letters but not digits. The block has bold A through Z, bold a through z, italic A through Z, and so on. It does not have bold 0 through 9. There is no Unicode character for "bold 7." The block simply does not contain one.
This means that when you type "Meeting at 7pm" and apply Bold Serif, the letters convert and the digit does not. The output is "𝐌𝐞𝐞𝐭𝐢𝐧𝐠 𝐚𝐭 7𝐩𝐦." The 7 stays a 7. The same is true for italic, script, fraktur, double-struck, small caps, and superscript. Digits pass through unchanged.
Circled text is the exception. The Enclosed Alphanumerics block (U+2460) does include circled digits, so circled numbers work. Fullwidth also works for digits, because the Halfwidth and Fullwidth Forms block includes fullwidth digits. But for most of the letter-only Mathematical Alphanumeric styles, digits are the gap. There is no fix. There is no "bold 7" character. The Unicode consortium never defined one, because the block was designed for mathematical variables, which are letters, not numbers.
Why the character counter lies, and why your bio gets truncated
The text formatter's character counter measures your input. If you type 100 characters, the counter says "100." If you pick Bold Serif and the counter shows a platform limit like "100/150 for Instagram Bio," you might think you are within the limit. You are not.
The Bold Serif transform doubles the length in UTF-16 code units. Each character in the Mathematical Alphanumeric Symbols block is in the supplementary plane (U+1D400 and up), which means it is encoded as a surrogate pair — two 16-bit code units. A 100-character input becomes 200 code units after the transform. Instagram's bio limit is 150 characters, but Instagram counts code units, not characters. A 100-character "bold" bio is actually 200 code units, and Instagram will truncate it.
The counter does not account for this. It measures the input text, not the output text. For styles that use combining marks (strikethrough, underline, bubble, Zalgo), the output is even longer — each character becomes two or more code units. For Zalgo Heavy, each character can become 10 or more code units as the combining marks stack up.
The fix is to count the output, not the input. After transforming, paste the result into a plain text editor that shows the character count of the selection, and check the count against the platform's limit. Or use a shorter input. A 50-character input transformed to Bold Serif is 100 code units, which fits in an Instagram bio. A 75-character input is 150, which is right at the edge. Anything longer will be truncated.
Why the text is not searchable
Social media platforms index the text you type. When someone searches for "coffee shop," the platform looks for posts and profiles that contain the literal string "coffee shop." If your bio says "𝐜𝐨𝐟𝐟𝐞𝐞 𝐬𝐡𝐨𝐩" — the same word, but with each letter swapped for its Mathematical Alphanumeric bold equivalent — the platform does not index it as "coffee shop." It indexes it as a sequence of supplementary-plane Unicode characters that happen to look like "coffee shop" when rendered. A search for "coffee shop" will not find your bio.
This is the trade-off of Unicode-styled text. You get the visual effect. You lose the searchability. For a personal bio that nobody searches for, this is fine. For a business profile that people search for by name, it is a problem. The styled name looks good, but the profile is invisible to search.
The same applies to hashtags. A hashtag like "#𝐬𝐚𝐥𝐞" is not the same hashtag as "#sale." The platform will not group your post with other posts tagged #sale. You will not show up in the hashtag aggregation. If the hashtag is the point, do not style it.
Why screen readers choke on it
Screen readers read text by looking up the Unicode code point and announcing the character's name. For plain ASCII letters, this is simple: "A" is announced as "A." For Mathematical Alphanumeric characters, the Unicode name is "mathematical bold capital A" or "mathematical italic small B." A screen reader reading a "bold" sentence will, depending on the screen reader and its settings, either announce each character with its full mathematical name (verbose and incomprehensible) or fall back to the base letter (losing the bold distinction entirely).
Combining marks are worse. A screen reader encountering a letter followed by a combining long stroke overlay may read the letter, then attempt to read the combining mark as a separate character, then announce it as "combining long stroke overlay" or skip it. For Zalgo text — a single letter stacked with 5 to 10 combining marks — the screen reader will either read the letter followed by a string of mark names, or give up and read nothing. Either way, the text is incomprehensible.
This is not a bug in screen readers. It is the correct behavior for the characters as they are defined. The characters are mathematical symbols, not styled text. The screen reader is reading them correctly. The problem is that the text formatter is using them for a purpose they were not designed for.
If accessibility matters — a government account, a business profile, anything that people will read with a screen reader — do not use Unicode-styled text. Use plain text, and rely on the platform's own formatting (headings, bold, italic) if it has any. If the platform has no formatting and you still want emphasis, use capital letters or punctuation, which screen readers handle correctly.
Zalgo, and why it regenerates differently each time
Zalgo text is the cursed-text meme — letters with stacks of combining marks drawn above and below, producing a dripping, glitchy look. The combining marks are picked randomly from a pool of about 30 marks (U+0300 through U+0357), and the number of marks per character is picked randomly too. Zalgo Light uses 1 to 2 marks per character. Zalgo Heavy uses 2 to 6 "above" marks and 1 to 4 "below" marks, producing taller stacks.
The randomness is the catch. Every time the tool re-renders, it picks new random marks. The output for the same input is different each time. There is no seed, no way to reproduce a result. If you generate Zalgo text, copy it, and paste it somewhere, that is the output. If you go back to the tool, type the same input, and generate again, you get a different output. The text you pasted is locked in, but the tool will not produce it again.
This is not a bug. It is the nature of combining marks stacked at random. If you want a specific Zalgo output, copy it the first time. Do not expect to reproduce it.
Gotchas
- The bold is not bold. It is a different character. The "bold" and "italic" styles swap each letter for a Mathematical Alphanumeric Symbol. The output is not formatted text; it is a sequence of Unicode characters that look bold. The platform stores the characters, not the formatting. If the platform's font has glyphs for them, they render as bold-looking text. If not, they render as empty boxes.
- Digits do not convert in most styles. The Mathematical Alphanumeric Symbols block defines letters, not digits. There is no "bold 7" character. Italic, script, fraktur, double-struck, small caps, and superscript all leave digits unchanged. Circled and fullwidth do convert digits, because their Unicode blocks include digit variants.
- The character counter lies. It measures your input, not the output. A 100-character input transformed to Bold Serif is 200 UTF-16 code units, because Mathematical Alphanumeric characters are surrogate pairs. Instagram's 150-character bio limit counts code units. Your 100-character "bold" bio will be truncated. Count the output, not the input.
- Screen readers either skip the styling or choke on it. Mathematical Alphanumeric characters are read as their full Unicode name ("mathematical bold capital A") or as the base letter without styling. Combining marks may be read as separate characters. Zalgo text is incomprehensible. Do not use these styles for anything a screen reader will read.
- The text is not searchable as the original. A bio that says "𝐜𝐨𝐟𝐟𝐞𝐞 𝐬𝐡𝐨𝐩" is not indexed as "coffee shop." Search will not find it. Hashtags with styled letters will not aggregate with the plain-text version of the hashtag. If search or hashtag aggregation is the point, do not style.
- Some characters render as tofu on older devices. The Enclosed Alphanumeric Supplement block (Negative Circled, Squared, Negative Squared, at U+1F130 and up) has poor font support on older Android and older Windows. The sans-serif Mathematical Alphanumeric variants also have gaps. If your audience is on older devices, test on those devices or stick to the well-supported styles (Bold Serif, Italic Serif, Fullwidth, Strikethrough).
- Combining marks render inconsistently. Strikethrough, underline, wavy, and bubble text all rely on the platform's text renderer to stack the combining mark correctly. Most modern platforms do. Some older platforms draw the mark in the wrong position, or do not draw it at all. The same text can look correct on iOS and broken on an older Android browser.
- Zalgo is non-deterministic. Every re-render picks new random combining marks. The output for the same input is different each time. If you generate Zalgo and like the result, copy it immediately. You will not be able to reproduce it.
- Circled, Squared, and Negative Circled uppercase the input. These three styles call
toUpperCase()before mapping, so they only produce uppercase output. If you type "hello," you get "ⓗⓔⓛⓛⓞ" (uppercase circled), not lowercase circled. The lowercase circled characters do not exist in the Unicode block. - Small Caps only maps lowercase. Uppercase input passes through unchanged. If you type "Hello," the H stays uppercase and the ello becomes small caps. The result is mixed-case and looks inconsistent. Type lowercase input for consistent small caps.
- No reverse transform. There is no "decode" function. Once you convert to Bold Serif, you cannot convert back to plain text with this tool. You would have to reverse the lookup table manually, or use a different tool that does reverse mapping. Keep your original input.
- No multi-style composition. You can apply one font style and one decorator. You cannot combine Bold and Strikethrough, or Italic and Bubble. If you want a combination, you would have to apply one, copy the output, paste it back as input, and apply the second — but the second style's lookup table does not include the first style's output characters, so this does not work in practice.
- Copy All can fail silently. The Copy All button uses the clipboard API without a fallback. If the page is served over HTTP (not HTTPS) or the browser has blocked clipboard access, the copy silently fails. The tool is served over HTTPS in production, so this is not an issue in practice, but it is worth knowing.
Summary
- Formatting text for social media is Unicode substitution, not real formatting. The "bold" is a Mathematical Alphanumeric Symbol, the "circled" is an Enclosed Alphanumeric, the "strikethrough" is a combining mark stacked on the letter. The platform stores the Unicode characters, not the formatting. If the platform's font has a glyph for the character, it renders as the styled look; if not, it renders as an empty box.
- The four mechanisms are lookup-table replacement (bold, italic, script, circled, most styles), arithmetic code-point shift (fullwidth), combining-mark insertion (strikethrough, underline, bubble, Zalgo), and character reversal (upside down). Digits do not convert in most letter-based styles because the Mathematical Alphanumeric Symbols block does not define digit variants. Circled and fullwidth are the exceptions.
- The character counter in these tools measures the input, not the output. A 100-character input transformed to Bold Serif is 200 UTF-16 code units, because each Mathematical Alphanumeric character is a surrogate pair. Instagram's 150-character bio limit counts code units, so your 100-character "bold" bio will be truncated. Count the output, not the input.
- Screen readers either skip the styling or read every character as "mathematical bold capital A," making the text incomprehensible. The styled text is not searchable as the original. Combining marks render inconsistently on older platforms. Zalgo is non-deterministic and regenerates differently each time. Circled, Squared, and Negative Circled uppercase the input. Small Caps only maps lowercase.
- Use the Text Formatter for Social for emphasis — a word in bold in a bio, a heading in a post, a stylistic flourish. Do not use it for body text, for bios you want people to find by search, for hashtags you want to aggregate, or for anything a screen reader will read aloud. Use the Instagram Caption Writer for the caption itself, the Text Case Changer for case conversion (which is real ASCII, not Unicode substitution), and the Hashtag Generator for the hashtags.