Emoji shows as □ / tofu / empty box (missing glyph)
The number arrived fine. The device just has no picture for it yet, so it draws a blank box nicknamed tofu.
What "tofu" means
Designers nicknamed the empty rectangle □ "tofu" because it looks like a blank block of bean curd. It appears when the text engine knows a Unicode code point exists but none of the fonts it searched contain a glyph for that point. The bytes are intact; only the picture is missing.
| What you see | Usually means | Data still there? |
|---|---|---|
| Empty / dotted box □ | Missing glyph (tofu): font too old or no colour emoji font | Yes |
| Black diamond � (U+FFFD) | Replacement character: bytes were invalid or already lost | No (already discarded) |
😊-style gibberish | UTF-8 read as Latin-1 / Windows-1252 | Yes, if you re-decode |
? or ???? | Often a 3-byte MySQL utf8 column or a Latin-1 sink | No for 4-byte emoji |
| Pieces of a family emoji | ZWJ sequences not supported; glue failed | Yes |
Interactive walkthrough of these four scenes: Wirebook's Who stole the emojis? lesson (Emoji X-ray + crime scenes).
Why new emojis break first
- Unicode adds a new emoji set every year. Phones and desktops ship fonts months later.
- Web pages that rely on the system emoji font inherit that lag. A brand-new "melting face" may tofu on an older Android or Windows build while looking fine on a fresh iPhone.
- Some enterprise / locked-down machines strip colour emoji fonts entirely, so every emoji becomes tofu.
How to check which problem you have
- Copy the "box" into another app (Notes, a modern browser, Wirebook's Emoji X-ray). If a real emoji appears elsewhere, it was tofu on the first device.
- Inspect the code point. In a capable editor or the X-ray, a tofu'd melting face still shows as
U+1FAE0. A real � shows asU+FFFD. - Check the byte length. Paste into the word & character counter or encode with the Base64 tool (UTF-8). A single modern emoji is typically 4 UTF-8 bytes (or more with ZWJ). If you only have
EF BF BD(the UTF-8 for �), the original was already lost. - Not sure what the blob is? Paste mystery text into What is this?.
Fixes
- Update the OS / app. Colour emoji fonts ride along with system updates. That is the usual fix when only one person sees boxes.
- Install an emoji font on the desktop (Noto Color Emoji, Segoe UI Emoji, Apple Color Emoji). On Linux, install
fonts-noto-color-emoji(Debian/Ubuntu) and restart the browser. - Web apps: do not ship a custom font that only covers BMP letters and expect emoji to render from it. Let the browser fall through to the system emoji font, or load a colour emoji webfont that explicitly covers the ranges you need.
- CSS:
font-family: "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif;as a fallback stack helps some desktop browsers pick a colour face. - If it is � or
?in the database, the damage already happened on write. See MySQL Incorrect string value / utf8mb4. Mojibake that still round-trips: mojibake guide.
Related
Why emoji make text messages shorter · Mojibake / ðŸ / é · MySQL Incorrect string value / utf8mb4 · Invisible zero-width characters · Base64 is not encryption · Wirebook emoji lesson · What is this? · Anvil text X-ray API · UnicodeDecodeError utf-8
Questions
Why does an emoji show as a box or square?
The device received the Unicode code point but has no glyph (picture) for it in any installed font. That blank box is nicknamed tofu. Update the OS or install a colour emoji font.
What does tofu mean for emoji?
Tofu is the empty rectangle □ drawn when a font is missing a glyph. The character is still in the text; only the artwork is missing.
Is � the same as a tofu box?
No. � is U+FFFD, the replacement character, meaning the original bytes were invalid or already discarded. Tofu means the code point is fine but undrawable.
Why do only some people see boxes?
Their phone, OS or browser has an older emoji font that predates that Unicode version. Others with newer fonts see the real picture.
How do I fix emoji boxes on Linux?
Install a colour emoji font such as fonts-noto-color-emoji, then restart the browser. Flatpak/Snap browsers sometimes need the font inside their sandbox too.
Published · updated .