Nerd Font / PUA Unicode characters not rendered (statusline, chat, file views) and dropped by the Read tool
This is a re-open of #49270 (closed as stale 2026-06-22), which was itself a re-open of #9907 (closed as stale 2025-10-19). The issue is still present and reproducing as of June 2026. Consolidating the original report plus all the follow-up findings here so the context isn't lost to another stale-closure.
Problem
Claude Code does not render Nerd Font / Private Use Area (PUA) Unicode characters (codepoints like U+E0A0, U+F302, etc.) anywhere in its UI. They appear as blank spaces or boxes — even when the terminal font is a patched Nerd Font (or a custom font containing all the glyphs) that renders them correctly in every other context.
This is not purely a font/rendering problem: as detailed below, the Read tool path also strips PUA characters before the model sees them, so it's reproducible across platforms and is partly in Claude Code's own text/TUI layer rather than the terminal.
Affected areas
- Statusline — custom statusline scripts that output Nerd Font icons (e.g. `
for git branch,` for PRs) show as blank - Chat messages — Nerd Font glyphs in assistant or user messages are invisible
- File views — config files for Starship, Alacritty, Kitty, etc. that contain Nerd Font symbols display as blanks, making it impossible to tell whether an icon is present or missing (as described in #9907)
Readtool / model-visible text — PUA characters present in a file are not surfaced to the model at all (see Windows repro below)
Why this matters
Claude Code has a customisable statusline (via ~/.claude/statusline.sh) that many teams use to surface git state, PR status, context-window usage, and model info. Nerd Font icons are the standard way to add meaningful, space-efficient visual cues to terminal UIs.
When Claude Code can't render a Nerd Font character in a file view, it silently shows a blank — causing wasted time debugging configs that are actually correct. Worse, when the Read tool drops PUA characters entirely, Claude can miss hidden markers during cleanup tasks and confidently report there are none.
Findings collected from the original thread
Still reproducing on Claude Code 2.1.141 — printing a handful of Nerd Font glyphs to verify rendering (` U+E725, U+F126, U+F418, U+E0A0) produces blank cells separated by commas. The same glyphs render correctly with printf` in the same terminal outside the TUI, and standard Unicode symbols (✓ ✗ → ★ ●) render fine inside it — so this is specifically a PUA codepoint width/rendering issue in the TUI layer, not a font or terminal problem.
Read tool drops PUA characters (Windows repro, Claude Code 2.1.101, Windows 11, Node v22.22.2, PowerShell, Sonnet 4.6) — contributed by @satyasairay:
- Create a file containing BMP PUA chars:
``powershell``
python -c 'from pathlib import Path; q=chr(34); nl=chr(10); Path("pua-test.md").write_text(f"Prompt: {q}Explain overfitting{q}{nl}", encoding="utf-8")'
- Verify the file really contains PUA chars —
pythonreportsU+E203,U+E204,U+E206. - Ask Claude Code to inspect the file using only the
Readtool. It displays the line asPrompt: "Explain overfitting"and does not report U+E203/E204/E206 — it even speculates the quotes might be smart quotes (they're plain ASCII). - Ask Claude Code to inspect the same file with Bash/Python instead — it correctly prints all three PUA codepoints.
So Bash/Python in the same session detect the characters, but the Read tool path does not expose them to the model.
Custom font setting does not help — reported by @nicolaschapados: even after setting the "custom monospaced font for code and terminal" to a font that contains all the custom characters, the glyphs still don't render. A Powerlevel10k (oh-my-zsh) prompt that renders correctly in a regular iTerm2 with that font renders with blank/broken glyphs in the Claude Code terminal. (Screenshots in the original thread: #49270.)
Expected behaviour
Either:
- Render Nerd Font / PUA Unicode characters using the system font or a bundled font that includes them, and preserve them through the
Readtool / model-visible text path, OR - Show the Unicode code point (e.g.
<U+E0A0>) as a fallback so the character is at least visible and configs become debuggable, instead of silently showing a blank or dropping the character entirely.
The fallback alone would already be a big improvement over silent blanks.
Reproduction (rendering)
- Add a Nerd Font icon to
~/.claude/statusline.shoutput, e.g.printf " branch"(U+E0A0) - The statusline shows a blank where the icon should be
- Run
echo " branch"in the same terminal — the icon renders correctly
References
- Original re-open: #49270 (closed stale 2026-06-22)
- First report: #9907 (closed stale 2025-10-19)
- Related: #6870 (Apple logo U+F8FF), #48805 (terminal font family setting)
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗