Fullwidth Text: The Halfwidth and Fullwidth Forms Block
Fullwidth text explained: what the Halfwidth and Fullwidth Forms block is, why the characters are double width, what it covers, and why NFKC removes it.

Fullwidth text is the wide, airy lettering of vaporwave album art: aesthetic instead of aesthetic. It is not a font and not letter-spacing. Each of those is a separate Unicode character that is defined as being twice as wide as a normal one.
Where it comes from
East Asian typesetting has a grid. Chinese, Japanese and Korean characters are square and all the same width, and text is laid out as a lattice of those squares. Latin letters are narrower and varied, which does not fit.
The fix, in the encodings of the 1980s, was to have two versions of every Latin letter: a halfwidth one occupying half a cell, and a fullwidth one occupying a whole cell so it lines up with the ideographs around it. Japanese encodings did the same in reverse for katakana, which got halfwidth forms so it could be squeezed into narrow fields.
When Unicode absorbed those encodings, it had to bring both forms in to round-trip losslessly. The result is Halfwidth and Fullwidth Forms, U+FF00 to U+FFEF.
What the block contains
| Range | Contents |
|---|---|
| U+FF01–U+FF5E | Fullwidth ASCII: punctuation, digits, A–Z, a–z |
| U+FF5F–U+FF60 | Fullwidth brackets |
| U+FF61–U+FF9F | Halfwidth katakana and Japanese punctuation |
| U+FFA0–U+FFDC | Halfwidth Hangul jamo |
| U+FFE0–U+FFE6 | Fullwidth currency and symbols |
| U+FFE8–U+FFEE | Halfwidth forms of symbols |
The fullwidth ASCII range is the useful one, and it is a straight offset: every printable ASCII character from ! (U+0021) to ~ (U+007E) has a fullwidth twin at exactly U+FF01 through U+FF5E, a constant 0xFEE0 higher.
That makes conversion trivial arithmetic with no exceptions — unlike the mathematical alphabets, which are full of holes.
| Plain | Fullwidth |
|---|---|
| ABCDEFGHIJKLMNOPQRSTUVWXYZ | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
| abcdefghijklmnopqrstuvwxyz | abcdefghijklmnopqrstuvwxyz |
| 0123456789 | 0123456789 |
| !?#$%&@ | !?#$%&@ |
The space is the exception
There is no fullwidth space at U+FF00. The fullwidth space is U+3000 IDEOGRAPHIC SPACE, in the CJK Symbols and Punctuation block instead.
This trips up nearly every naive converter, which leaves ordinary narrow spaces between wide words and produces text that looks wrong without it being obvious why. The vaporwave text generator uses U+3000, which is why its output spaces correctly.
Why it looks the way it does
The width is not a font effect you could reproduce with CSS letter-spacing. It is a property of the characters: Unicode gives every character an East Asian Width value, defined in Unicode Standard Annex #11, and these are classified F for Fullwidth. A terminal or a monospaced layout engine will reserve two columns for each one.
That has a practical consequence beyond aesthetics: fullwidth characters break column alignment in terminals, text tables and code. If you paste them into a monospaced context expecting them to line up, they will not.
What it is used for
Vaporwave. The dominant use. The aesthetic reached for the visual language of 1990s Japanese consumer electronics, and fullwidth Latin text — the way a Japanese system renders English — became its most recognisable typographic signature. See the vaporwave text generator.
Spacing without spaces. Because the characters are wide in themselves, fullwidth text stays wide in fields that collapse repeated spaces. That makes it more robust than typing a e s t h e t i c, which many platforms will collapse back.
Genuine CJK typesetting. Where it belongs: keeping Latin words aligned to the grid inside Japanese or Chinese text.
What it costs
NFKC removes it entirely. Every fullwidth character carries a compatibility decomposition to its plain ASCII equivalent, so HELLO normalises to HELLO. Any platform that normalises usernames or identifiers will undo it — deliberately, because admin and admin folding to the same string is what stops one impersonating the other. See unicode normalisation.
Search does not match it. Nobody typing aesthetic finds aesthetic unless the search normalises, and most do not.
It is three bytes per character in UTF-8, against one for plain ASCII. A fullwidth bio is three times the byte length, which matters where a limit is counted in bytes.
Screen readers vary. Some map fullwidth forms back to the plain letters and read them normally; others read character names. It is better handled than the mathematical alphabets, but not reliable.
Font coverage
Excellent, and better than any other styled block on this site. These characters are in the Basic Multilingual Plane and have been part of every CJK font for decades, so anything with East Asian support renders them — which in practice is every modern operating system.
If you want styled text that will not turn into empty boxes on an old Android phone, fullwidth is the safest choice available.
Halfwidth katakana
The other half of the block, rarely relevant outside Japanese. アイウエオ are halfwidth katakana, encoded so katakana could fit into narrow fixed-width fields in older systems — receipt printers, bank terminals, early mobile phones.
They are considered poor typography in modern Japanese text and are normally converted to the full forms. They appear in retro-styled design for the same reason fullwidth Latin does: they look like old hardware.
Quick answers
Is fullwidth text a font?
No. The characters are defined as double-width; no font is involved.
Why do the spaces not look right?
Use U+3000 IDEOGRAPHIC SPACE. There is no fullwidth space in this block.
Will it work on Instagram and Discord?
Yes, and it renders more reliably than the mathematical alphabets on old devices.
Why does my fullwidth username revert?
NFKC normalisation converted it back. That is standard behaviour for identifiers.
Can I convert fullwidth back to normal?
Yes — subtract 0xFEE0 from each character in U+FF01–U+FF5E, or apply NFKC.
Related
- Vaporwave text generator — fullwidth applied to your text
- Unicode normalisation — why NFKC folds it away
- Unicode blocks reference — every block used here
- Invisible characters — including U+3000, the ideographic space