On Twitter/X, two different kinds of styled Unicode characters both cost 2 units toward the 280-character tweet limit, but the reasons are completely different. Mathematical Bold letters cost 2 because of UTF-16 encoding. Fullwidth letters also cost 2 because of a display-width policy Twitter applied for CJK characters. Getting this wrong means posting styled text that uses more characters than you expect.

How Twitter Counts Characters

Twitter measures tweet length in UTF-16 code units. This is the character encoding that JavaScript uses internally, and Twitter's original codebase was JavaScript. UTF-16 encodes the Basic Multilingual Plane (characters up to U+FFFF) as a single 16-bit code unit, and everything above U+FFFF as two 16-bit code units called a surrogate pair.

So for standard ASCII text, every character is one UTF-16 unit. For supplementary plane characters — those above U+FFFF — every character is two UTF-16 units. Mathematical Bold is encoded in the Supplementary Multilingual Plane starting at U+1D400. Every Mathematical Bold letter requires a surrogate pair in UTF-16, which means each bold letter in a tweet costs 2 of the 280 characters.

A 280-character tweet written entirely in Mathematical Bold can contain only 140 actual letters — the same count as an old-style SMS. This is why styled text tweets run out of space faster than expected.

SMP Styles That Cost 2 Per Character

Every style that draws from the Mathematical Alphanumeric Symbols block (U+1D400–U+1D7FF) costs 2 Twitter units per letter. This includes:

  • Mathematical Bold (𝗛𝗲𝗹𝗹𝗼)
  • Mathematical Italic (𝘻𝘦𝘭𝘭𝘰) — except h, which uses the BMP Planck constant U+210E
  • Mathematical Bold Italic (𝙃𝙚𝙡𝙡𝙤)
  • Mathematical Script (𝑃𝑐𝑟𝑟𝑜) — except the BMP exceptions: ℬ B, ℰ E, ℱ F, ℋ H, ℐ I, ℒ L, ℳ M, ℛ R, ℯ e, ℊ g, ℴ o (these 11 cost 1 unit each)
  • Mathematical Bold Script (𝒡𝒸𝓁𝓁𝒸)
  • Mathematical Fraktur (𝔥𝔢𝔩𝔩𝔬) — except BMP exceptions: ℭ C, ℌ H, ℑ I, ℜ R, ℨ Z (these 5 cost 1 unit each)
  • Mathematical Double-Struck (𝔻𝕖𝕝𝕝𝕠) — except BMP exceptions: ℂ C, ℍ H, ℕ N, ℙ P, ℚ Q, ℝ R, ℤ Z (these 7 cost 1 unit each)
  • Mathematical Sans-Serif variants (regular, bold, italic, bold-italic) (𝙳𝚊𝚕𝚕𝚘)
  • Mathematical Monospace (𝙻𝚎𝚕𝚕𝚘)

Standard emoji are also SMP characters (U+1F300 and above) and cost 2 Twitter units each. This is the same mechanism — surrogate pairs in UTF-16.

Why Fullwidth Also Costs 2 (Different Reason)

Fullwidth characters live in the Basic Multilingual Plane, in the Halfwidth and Fullwidth Forms block (U+FF00–U+FFEF). They are below U+FFFF, so they encode as a single UTF-16 code unit. The reason they cost 2 Twitter characters is different: Twitter applies a display-width calculation that counts CJK-class characters as double-width.

Japanese, Chinese, and Korean characters are traditionally displayed in a square glyph that occupies two column widths of monospace text. The Fullwidth Forms block exists because East Asian computing historically used fixed-width terminals, and fullwidth Latin letters were defined to match the column width of CJK characters. Twitter classifies fullwidth Latin characters using their Unicode East Asian Width property, which is "fullwidth" — the same property as CJK characters — so Twitter's counter increments by 2 for each one.

The practical result is the same as SMP: a 280-character tweet in fullwidth text can contain only 140 visible characters. But the mechanism is different. SMP characters cost 2 because UTF-16 encodes them as two code units. Fullwidth characters cost 2 because a display-width policy classifies them as double-width. This distinction matters when debugging why a tweet is hitting the limit unexpectedly.

What Costs 1 Per Character (BMP, Non-CJK)

Unicode styles that use BMP characters and are not classified as fullwidth or CJK each cost 1 Twitter unit per character:

  • Small caps (Latin phonetic extensions, IPA Extensions) — ᴄᴀʀᴏɴ uses BMP characters
  • The BMP exceptions within Script, Fraktur, and Double-Struck (listed above)
  • Enclosed Alphanumerics — circled hollow letters (ⒶⒷⒸⒹⒺ) from U+24B6–U+24E9 are BMP
  • Combining diacritic styles (strikethrough U+0336, underline U+0332) count the base character as 1 and each combining mark as 1 additional unit

Note that the filled (negative) circled letters from the Enclosed Alphanumeric Supplement (🅐🅑🅒) are SMP (U+1F150 and above) and cost 2 units each, despite being visually similar to their hollow BMP counterparts.

Display Name and Bio

Twitter/X allows Unicode styled text in both the display name (50-character limit) and the bio (160-character limit). The same UTF-16 and CJK-width counting applies — a 50-character display name in Mathematical Bold can contain only 25 actual letters.

The username (@handle) is ASCII only: letters, digits, and underscores, up to 15 characters. Unicode styled characters are not accepted. The username is what @mentions use; the display name is what appears alongside posts.

Mathematical Bold is the most common style choice for Twitter display names because it renders reliably across platforms — all SMP Mathematical Alphanumeric glyphs have solid font coverage on Windows (Cambria Math), Android (Noto), and modern macOS and iOS (via emoji fallback). It also remains readable at the small sizes Twitter uses to display the name inline in timelines.

Hashtags: Same Problem as Instagram

Hashtags on Twitter must contain only ASCII alphanumeric characters and underscores. A hashtag using Unicode styled text — such as #𝗛𝗲𝗹𝗹𝗼 or #Hello — does not become a discovery link. Twitter's hashtag parser recognizes the # symbol followed by the Unicode styled letters as a potential hashtag, but because the characters are not ASCII alphanumeric, it either does not linkify them or routes them to an empty search.

The practical approach is the same as Instagram: use styled text for aesthetic content in the tweet body, and write hashtags in plain ASCII after the main text. This keeps the styled content while preserving hashtag functionality.

URL Character Counting

Every URL in a tweet — regardless of its actual length — counts as 23 characters because Twitter wraps all URLs through t.co shortening. A URL to a site with a 200-character address still costs 23 characters in the tweet. This is distinct from styled text counting and does not interact with the SMP/fullwidth doubling.

How to Stay Under 280 With Styled Text

Because SMP and fullwidth both halve the effective character budget, use styled text strategically rather than converting the entire tweet. A common pattern is to style only the display name (which has its own limit and does not count against tweet length) and write the tweet body in plain text, reserving styled characters for emphasis on specific words rather than full sentences. This maximizes the actual content that fits in the tweet.

A tweet containing a mix of styled and plain text consumes the budget proportionally. Plain ASCII letters cost 1 each; Mathematical Bold letters cost 2 each; fullwidth letters cost 2 each. Counting the actual budget consumed requires knowing which code points are SMP or fullwidth-class, not just counting the visible letters.

The Twitter / X Font Generator shows the real character cost of a styled string as you type it, SMP and fullwidth both counted correctly.

Twitter/X also enforces different rules on the two name fields. The @handle is ASCII-only, the same identity-namespace restriction seen on YouTube and Instagram usernames, while the display name above it accepts full Unicode styling. Only the display name is worth styling; the handle will reject Mathematical Alphanumeric characters outright.