Symbols show up as empty boxes when your device has no font that can draw that character, and as question marks, black diamonds (�) or strings like “é” when text was saved in one encoding and read in another. The first is a display problem you fix with fonts or updates; the second is a data problem you fix by using UTF-8 consistently.
✓DetailsIdentify the symptom first
Different symptoms have different causes. Match what you see:
| What you see | Nickname | Usual cause | Is the data damaged? |
|---|---|---|---|
| Empty rectangle □ or a box with a tiny hex code inside | Tofu | No installed font has a glyph for the character | No |
| Black diamond with a question mark � | Replacement character | Bytes that are invalid in the encoding the software assumed | Often, once saved |
| Plain question marks ? or ??? | — | Text was converted to an encoding that lacks the character | Yes, the original is lost |
| Strings like é, ’, € | Mojibake | UTF-8 bytes read as Windows-1252 or Latin-1 | Not yet; it can usually be reversed |
| A different-looking symbol than expected | — | Font substitution, or an emoji vs. text presentation difference | No |
Boxes (“tofu”): the font is missing the glyph
Unicode defines characters, but fonts draw them. A single font rarely covers more than a fraction of Unicode. When the font you are using lacks a character, your system looks for another installed font that has it (font fallback). If none does, you get an empty box, often called “tofu” because it looks like a block of tofu. Some systems show a box with the code point printed inside it, which is actually helpful: it tells you exactly which character is missing.
The character itself is fine. Copy the box and paste it somewhere else, or into the Unicode Lookup tool, and you will see the real code point and name.
Common reasons for tofu
- A new character on an older system. Emoji and symbols added in recent Unicode versions appear as boxes until your operating system ships a font that includes them.
- A rare block. Characters like Braille patterns, mathematical alphanumeric symbols, historic scripts or less common technical symbols are missing from many default fonts.
- An app that does not use font fallback. Some games, terminals, older desktop apps and embedded displays render only with one font and show boxes for anything outside it.
- A web page that forces a single web font without a sensible fallback list in CSS.
- Private use characters. Code points in the private use area (such as U+E000 to U+F8FF) only display with the specific icon font they were made for.
How to fix boxes
- Update your operating system and browser. New Unicode characters, and especially emoji, arrive with system updates.
- Install a font with broad coverage. Google’s free Noto font family was created specifically to eliminate tofu and covers a very large share of Unicode. Segoe UI Symbol on Windows and Apple Symbols on Mac cover many symbols too.
- Change the font in the document. In Word or Google Docs, select the box and try a different font. If the character appears, the old font simply lacked it.
- For web developers: end your CSS
font-familylist with a generic family such assans-serifso the browser can fall back, and test symbols on Windows, Mac, Android and iPhone. - Choose a better-supported alternative. The plain check mark ✓ (U+2713) displays on more systems than newer pictographs. The symbol search can help you find a common look-alike.
The black diamond question mark (�)
The � is a real Unicode character, U+FFFD REPLACEMENT CHARACTER. Software inserts it when it tries to decode bytes as UTF-8 (or another encoding) and finds a sequence that is invalid. The most common trigger is text saved as Windows-1252 or Latin-1 and then read as UTF-8: a single byte like E9 (é in Windows-1252) is not valid on its own in UTF-8, so it becomes �.
If you only see it on screen, fix the encoding setting and reload. If the file has been saved again after the � appeared, the original byte is gone and you will need to restore the text from a backup or retype it.
Plain question marks (?): lossy conversion
An ordinary ? in place of a character usually means text passed through a system that could not represent it and substituted a question mark. Examples: pasting emoji into an old app that only supports a Windows code page, exporting to a legacy encoding, or storing emoji in a database that cannot hold four-byte characters. This damage is permanent; the question mark is now the actual stored character.
WordPress and MySQL note: MySQL’s older utf8 character set (also called utf8mb3) stores at most three bytes per character, which excludes most emoji and other characters above U+FFFF. Use utf8mb4 for tables and connections so these characters are stored correctly.
Mojibake: é, ’ and friends
Mojibake (a Japanese term for garbled characters) happens when UTF-8 bytes are read as a single-byte encoding such as Windows-1252. Each multi-byte character splits into two or three wrong characters:
| Intended | UTF-8 bytes | Shown as |
|---|---|---|
| é | C3 A9 | é |
| ü | C3 BC | ü |
| ’ (curly apostrophe) | E2 80 99 | ’ |
| — (em dash) | E2 80 94 | — |
| € | E2 82 AC | € |
| Byte order mark | EF BB BF |  |
The good news: until someone saves the garbled version, the underlying bytes are correct. Telling the software the text is UTF-8 makes it display properly.
How to fix encoding problems
- Web pages: save files as UTF-8, put
<meta charset="utf-8">at the top of the<head>, and make sure the server’sContent-Typeheader sayscharset=utf-8. A header that says otherwise overrides the meta tag. - Text editors: use “Save as” or “Reopen with encoding” and choose UTF-8.
- Excel and CSV files: CSV files have no place to declare their encoding. When saving, choose “CSV UTF-8 (Comma delimited)”. When opening, use Data > From Text/CSV and set the file origin to 65001: Unicode (UTF-8) instead of double-clicking the file.
- Email: set your mail client or sending platform to UTF-8 for outgoing messages.
- Databases: use a UTF-8 character set (
utf8mb4in MySQL) for the table, the column and the connection. A mismatch at any one of these layers produces mojibake. - PHP and WordPress files: save PHP files as UTF-8 without a byte order mark. A BOM at the start of a PHP file outputs invisible bytes before your page and is a known cause of “headers already sent” errors and stray  characters.
When the symbol looks different, not broken
Sometimes a symbol appears, just not as you expected. Two frequent reasons:
- Font differences. Every font draws a symbol its own way. A black star ★ can look thin in one font and chunky in another.
- Emoji vs. text presentation. Some characters, like ❤ (U+2764) or ☀ (U+2600), can display as a flat text symbol or as a colored emoji. A following invisible variation selector (U+FE0F for emoji style, U+FE0E for text style) requests one or the other, and platforms differ in their defaults.
Quick checklist
- Paste the problem character into the Unicode Lookup tool. If it shows a sensible code point, the data is fine and the issue is fonts.
- If it shows U+FFFD or a sequence like é, the issue is encoding. Find where UTF-8 is being read as something else.
- If it shows U+003F (a real question mark), the character was lost in a conversion. Fix the system that converted it, then re-enter the text.
- If you are publishing, pick well-supported characters and test on several devices.
Frequently asked questions
Why do some emoji show as boxes on my computer but not on my phone?
Your phone has a newer emoji font. Emoji are added to Unicode regularly, and older desktop systems do not have glyphs for the latest ones until they are updated.
If I copy a box and send it to someone, will they see a box?
Not necessarily. The box is only how your device displays it. The actual character is copied, and it will display properly on any device that has a suitable font.
What does � mean in a text message or email?
The software could not decode some bytes in the encoding it expected. The sender’s and receiver’s encodings did not match, or the message was damaged in transit.
Can I fix é in an existing document?
Usually, yes, as long as the text has not been converted and saved multiple times. Reopen the file as UTF-8. For text already stored in a database, the fix is to convert it back from the wrong encoding, which should be done carefully on a backup copy.