If you have spent any time on Discord or TikTok in the last few years, you have seen text that looks like this. Wide, evenly spaced, slightly retro. It gets called "vaporwave text" or "aesthetic text," and most people assume it is some kind of special font. It is not. It is a trick of the Unicode standard, and once you understand how it works, you will never look at a text box the same way again.
It is not a font, it is a different character
Every letter you type on a keyboard maps to a code point in the Unicode standard. The regular letter "A" is U+0041. But Unicode also defines a block called Halfwidth and Fullwidth Forms, originally built for East Asian typesetting where characters need consistent widths. Inside that block sits a fullwidth "A" at U+FF21, a completely separate code point that happens to render as a wide version of the same letter.
So when a generator turns "hello" into "hello", it is not applying a font style. It is swapping each character for a different, unrelated character that looks similar but occupies its own slot in the Unicode table. That is also why it survives copy and paste into any app: you are not carrying formatting, you are carrying literal characters, and any system that renders Unicode text will render them the same way.
Why this matters for developers
This has real implications if you are building anything that touches user-generated text:
-
String length checks break.
"hello".lengthis 5, but the fullwidth version is still 5 JavaScript UTF-16 code units, yet visually it takes up roughly double the horizontal space. If you are truncating text for a UI, character count and rendered width are no longer the same thing. -
Search and filtering can silently fail. A naive
includes()or SQLLIKEcheck against "hello" will not match "hello" unless you normalize first. Unicode'sNFKCnormalization form will fold fullwidth characters back to their standard-width equivalents, which is usually what you want for search indexes and profanity filters. - Fonts and screen readers behave inconsistently. Not every font ships full coverage of the Halfwidth and Fullwidth Forms block, so fallback glyphs can appear. Screen readers may also pronounce these differently, or not at all, since they are technically distinct characters rather than styled text.
Building it yourself
The core transform is a straightforward offset. Standard ASCII printable characters run from ! (U+0021) to ~ (U+007E). Their fullwidth counterparts sit at a fixed offset of 0xFEE0 higher, so a minimal converter looks like this:
function toFullwidth(str) {
return str.replace(/[!-~]/g, (c) =>
String.fromCharCode(c.charCodeAt(0) + 0xFEE0)
);
}
toFullwidth("hello"); // "hello"
Space is the one exception, since U+3000 (ideographic space) is used instead of a simple offset, because there is no fullwidth code point at the expected position.
Other "aesthetic" styles you will see on generators, like small caps, strikethrough, or bold sans-serif letters, work the same way in principle: they map standard letters to lookalike characters from entirely different Unicode blocks, such as Mathematical Alphanumeric Symbols. None of it is font styling. All of it is character substitution.
Trying it without writing the code
If you just want the output without building the converter, I put together a free tool that generates fullwidth and other Unicode text styles instantly: Aesthetic Text Generator. It is useful either way, as a quick generator or as a reference for seeing which code points a given style actually uses.
Understanding the mechanism behind it is the more durable takeaway though. Unicode is bigger and stranger than most of us think about day to day, and "aesthetic text" is a fun, low-stakes way to run into that.
Top comments (0)