Why a Symbol Shows as a Square Box
Last reviewed on May 7, 2026
You paste a perfectly good Unicode character — a heart, a currency sign, an emoji — and your screen shows a square box instead. The character on the page is correct. The problem is that your device cannot draw it. This page explains why that happens, when it matters, and what to do about it.
What is “tofu”?
The hollow rectangle that appears in place of an unsupported character is called tofu. The name comes from its resemblance to a block of tofu when it appears in a sea of CJK text. You'll also hear it called “the missing-glyph box,” the “notdef glyph,” or simply “a box character”. They all mean the same thing.
Tofu is the rendering system telling you, honestly, that it tried to draw a character and failed. The character is in the document; the device just doesn't have a font that knows how to draw it.
Why characters and fonts are different things
Unicode is a list of code points — numbers assigned to characters. The character “€” is U+20AC (decimal 8364). The Unicode standard says what the character means and roughly what shape it should have, but it doesn't actually contain any pictures.
Pictures live in fonts. A font is a list of glyphs (the actual shapes drawn on screen) keyed by code point. Arial knows how to draw U+20AC. The same is true of every standard system font on a modern computer or phone for the common code points.
Tofu happens when:
- The document contains code point N.
- The font the renderer is using doesn't have a glyph for code point N.
- None of the fallback fonts the renderer can switch to have a glyph for code point N either.
Step 3 is important. Modern browsers and operating systems have a fallback chain: if the primary font is missing the character, the system tries the next font in the chain, then the next, until something matches or the chain runs out. Tofu means the chain ran out.
Common causes
The character is too new
Unicode adds new characters every year. The bitcoin sign (₿, U+20BF) was added in Unicode 10.0 (2017). Some emoji from recent versions are still missing on devices that haven't been updated. If a character is rendering as tofu, the most likely cause is that your device is older than the character.
Limited-range fonts
Some fonts only cover Latin-1, or Latin-1 plus the few Unicode characters used in Western European languages. Popular display fonts and brand fonts often have very narrow coverage. If a website uses a custom display font without configuring fallbacks correctly, every character outside that font's range will tofu.
Embedded fonts in PDFs
PDFs sometimes embed only the glyphs the document uses at the time of export. If you edit the PDF later and add a character the embedded font doesn't include, that character will tofu when the PDF is reopened.
Stripped or replaced fonts
Some operating systems remove fonts that are not in regular use to save space. Specialty fonts containing math, ancient scripts, or musical notation are common casualties. Without the font, characters in those ranges fall through the chain and end up as tofu.
Surrogates and combining sequences
Some emoji are built from a sequence of code points (a base + combining mark, or a sequence joined by zero-width joiners). On a device that doesn't understand the sequence, you'll see the parts as separate characters or boxes rather than the combined emoji. This is more often a software-version issue than a font issue.
How to tell what kind of problem you have
Three quick checks distinguish the common cases:
- Does it tofu in every app, or just one? If it's only one app, the app is using a custom font with limited coverage and isn't falling back. The character is fine; the app's typography isn't. Try a different app.
- Does it tofu in every browser, or only one? Browser-specific tofu usually means a CSS
font-familyon the page is forcing a font that doesn't include the character. Disabling page CSS in dev tools shows whether the system font would render it. - Does it tofu on every device, or just yours? If only your device has the problem, it's a font issue. If everybody has the problem, the document is using a code point that hasn't been widely deployed yet.
Fixes for readers
- Update your operating system. Most font additions ride along with OS updates. A device that's two or three years out of date is missing the most recent emoji and many recent symbols.
- Install a coverage font. Free fonts with very wide Unicode coverage (covering thousands of code points across many scripts) are available; installing one and adding it to the system fallback chain eliminates most tofu.
- Use a different browser. Browsers have their own font-fallback logic. Chrome, Firefox, and Safari sometimes resolve tofu differently for the same character.
- Copy to a plain-text editor first. If a character is wrapped in styling that forces a narrow font, copying it into a plain editor and back removes the styling and lets system fallback do its job.
Fixes for authors
If you're writing content and worried about readers seeing tofu, the best protection is to design with fallback in mind:
- Specify a font stack with broad coverage at the end. Your CSS
font-familyshould end with system stack values (system-ui, sans-serif) or with a known wide-coverage font. The browser uses what it finds. - Test on a real older device. If your audience includes users on older phones, paste a sample of the characters into a draft and check from a device a few years old.
- Avoid recent additions for critical content. If a character is critical to the meaning of your text and was added to Unicode in the last two or three years, prefer an older equivalent or write the meaning out.
- Pair shape with text. If a symbol carries meaning by itself (a checkmark for “done”), pair it with the word. Tofu users still get the message; assistive-tech users do too.
What does NOT fix tofu
- Changing the encoding from UTF-8 to something else. The character is fine; the font is missing. Changing encoding can introduce mojibake (garbled multi-character sequences) on top of the tofu.
- Re-typing the symbol. The retyped symbol has the exact same code point. The font is still missing.
- Using an HTML entity.
♥and the literal ♥ are the same character; if ♥ tofus, so will the entity. - Switching the document's font. This can help if the new font has broader coverage. It does not help if both fonts are equally narrow.
When tofu is intentional
Some products substitute a custom “not-deployed” glyph that looks like tofu on purpose. The Noto font family from Google — the name is short for “no more tofu” — was created specifically to cover every character in Unicode and give designers a font that won't render boxes. If you see something that looks like tofu but is actually a custom missing-character glyph, you're seeing a product team's deliberate choice to indicate the problem visibly rather than silently.
Related
If you're seeing tofu specifically when you copy from a webpage, the Unicode converter can confirm what code point you're actually copying — sometimes the page contains an invisible character or a wrong code point and the rendering is correct. The aesthetic symbols page intentionally draws from older, well-supported blocks; the emoticons and currency pages are where you're most likely to encounter recently-added characters.