Claude CodeでNerd Fontのアイコンが消える原因と切り分け方
Nerd FontやPowerlineのアイコンが空白になる症状は、端末のフォント、モデルの出力、Readツールの3か所に分けて見ます。issue #70301の検証結果と、statuslineをエスケープで書く回避策をまとめます。
Claude CodeでNerd FontやPowerlineのアイコンが空白になるとき、原因は1か所とは限りません。端末のフォントが原因の場合と、Claude Codeに書かせた文字そのものが消えている場合があります。見た目は同じ空白でも、直し方がまったく違います。
結論から言うと、症状は次の3つに分けて見ます。
アイコンが消える3つの場所
端末の表示
statuslineやチャットで、文字は届いているのに空白に見える。フォントの問題で、端末側の設定で直ります。
モデルの出力
Claudeに書かせた応答やファイルに、アイコンの文字が入っていない。U+E000〜U+F8FFの範囲で起きます。
Readツール
読ませたファイルのアイコンをClaudeが報告しない。元の報告と、その後の検証で結論が割れています。
根拠にするのはGitHubのissue #70301です。このissueは、過去にstaleで閉じられた #9907と #49270を引き継いだもので、labelsに bug と has repro、area:tui、area:tools、area:statusline が付いています。起票時点の本文は「TUIのどこでも描画されない」と書いていますが、2026年8月のコメントで検証が進み、症状が分解されました。
まず端末側かどうかを切り分ける
最初に確かめるのは、同じ端末のClaude Codeの外でアイコンが出るかどうかです。
printf '\356\202\240 main\n'\356\202\240はU+E0A0(Powerlineのブランチ記号)をUTF-8にした3バイトです。8進数で書いているのは、shやdashのprintfでも同じ結果になるためです。ここで空白が出るなら、Nerd Fontが端末に設定されていないだけで、Claude Codeは関係ありません。
出る場合は、Claude Codeの中の経路を調べます。issue #70301のコメントでは、v2.1.233のmacOS(tmux 3.5aとraw ptyキャプチャ)で次の結果が報告されています。
- statuslineの行に、U+E0A0・U+F407・U+F035Bの3文字とも端末のセルに入っていた
- 入力したプロンプトのエコー行にも残っていた
- Bashツールの出力にも残っていた
つまり、この版ではClaude Codeの端末描画層が私用領域(PUA)の文字を落としてはいません。空白に見えるなら、フォントの側を疑います。コメントには、Claudeデスクトップアプリ内蔵の端末は別のレンダラーなので、そこで空白になる例が当てはまると書かれています。
ただし、元の報告者は「Nerd Fontを設定したiTerm2では出るPowerlevel10kのプロンプトが、Claude Codeの端末では壊れる」とも書いています。この食い違いは、issueの中でも決着していません。自分の環境で上のコマンドを試し、Claude Code内のBashツール出力と見比べるのが確実です。
Claudeが書いたファイルからアイコンが消える
#70301でいちばん実害が大きいのは、描画ではなく出力の側です。このコメントは次の手順で検証しています。
- 「U+E0A0とU+F303とU+F035BとU+2713を含む行を、そのまま返して」と頼む
- 応答を端末のセルで見る
claude -p --output-format jsonで生の応答テキストを見る- 同じ行をWriteツールでファイルに書かせ、バイトを見る
結果は3通りとも同じでした。U+E0A0とU+F303(BMPのPUA)は応答にもJSONにも書かれたファイルにも出てこず、U+F035B(第15面のPUA)とチェックマークは残りました。モデル自身の出力に、U+E000〜U+F8FFが入らないという観察です。別のコメントも、同じメッセージの中でU+F303は空白、U+F035BとU+F1105は表示されたと報告しています。
このコメントは、原因を「CLIのテキスト処理ではなく、モデルかAPI側の制約に見える」と評価し、担当チームに回すと書いています。修正の見込みを示す記述はありません。issueはその後もopenのまま、labelsに stale が付いています。
影響を受ける作業
- statuslineのスクリプトをClaudeに書かせると、
printfに埋め込んだアイコンが消えたスクリプトができる - Starship、Alacritty、Kittyの設定ファイルをClaudeに編集させると、既存のアイコンが黙って落ちる
- 独自のアイコンフォントを持つ製品のソースを編集させると、グリフが消える
3つ目は独自アイコンフォントを使う開発者のコメントです。BMPのPUA(U+E025付近)にカスタム絵文字を割り当てたフォントを使うリポジトリで、Claude Codeが編集のたびに文字を落とし、転写に何も出ないため、ヘキサダンプで初めて気づくと書かれています。Nerd Fontに限らず、私用領域を使う資産全体の問題です。
アイコンをエスケープで書いて回避する
このコメントの回避策は、文字そのものではなく\uE025のようなエスケープをソースに書くことです。Claude自身が書くのは普通のASCII文字だけなので、落ちません。シェルスクリプトでは、UTF-8のバイト列を8進数で書く形になります。
#!/bin/bash
# U+E0A0(Powerline のブランチ記号)を UTF-8 のバイト列で書く
BRANCH_ICON=$(printf '\356\202\240')
input=$(cat)
branch=$(git branch --show-current 2>/dev/null)
printf '%s %s\n' "$BRANCH_ICON" "$branch"PythonやJavaScriptなら"\uE0A0"のようなエスケープがそのまま使えます。第15面のU+F035Bなどは\U000F035B(Python)や\u{F035B}(JavaScript)です。コードポイントからUTF-8のバイトを知りたいときは、python3 -c "print(chr(0xE0A0).encode())"が便利です。
statuslineはスクリプトの標準出力を表示する仕組みなので、スクリプトがバイト列を正しく出せば、あとはフォントだけの問題になります。statuslineの設定方法と表示項目の選び方はClaude Code statuslineの設定ガイドにまとめています。
既存のファイルにアイコンが残っているか確かめる
Claudeにファイルを編集させたあと、アイコンが落ちていないかを目で確かめるのは困難です。画面では空白に見えるからです。BMPのPUA文字がファイルにあるかどうかは、Claudeに任せず自分で数えます。
python3 - statusline.sh <<'PY'
import sys
for n, line in enumerate(open(sys.argv[1], encoding="utf-8"), 1):
for col, ch in enumerate(line, 1):
if 0xE000 <= ord(ch) <= 0xF8FF:
print(f"{n}:{col} U+{ord(ch):04X}")
PY行番号と桁、コードポイントが出ます。編集前後で出力を比べ、行が減っていたらClaudeが落とした文字があります。差分をgit diffで見る場合も、空白に見える行の変化は読み取りにくいので、git diff --word-diff-regex=.のように1文字単位で比べるか、上のスクリプトの出力を使います。
Readツールはどうか
元の報告は、Readツールが私用領域の文字を落とすと主張しています。Windows 11のv2.1.101で、U+E203・U+E204・U+E206を含むファイルをReadだけで読ませたところ、Claudeはそれらを報告せず、引用符がスマートクォートではないかと推測しました。同じファイルをBashやPythonで読ませると3つとも出てきます。
一方、検証コメントはv2.1.233で--output-format stream-json --verboseを使い、Readの結果テキストには私用領域の文字が残っていると確かめています。結論は「Readが落としているわけではない」です。ただしモデルは「私用領域のグリフがある」ことまでは分かっても、コードポイントを正確には読めず、U+E0A0を生の文字として書き戻すこともできませんでした。
2つの報告は版も環境も違うので、どちらが現行の挙動かをこのissueだけで決めることはできません。実務では、Readで読ませた結果は信用せず、アイコンの有無はBashかPythonでコードポイントを出して確認する、という使い方が安全です。Readツールの一般的な仕様(行番号付きの返却、巨大ファイルのPARTIAL view、画像・PDF・ノートブックの扱い)は、ツールの説明に載っています。私用領域の文字についての記述は、その説明にはありません。
同じ症状は3回起票されている
issue #70301の本文によると、この症状はstaleで閉じられるたびに再起票されてきました。
Nerd Font問題の起票履歴
- 2025-10-19#9907がstaleで終了
最初の報告です。修正されないまま閉じられました。
- 2026-06-22#49270がstaleで終了
#9907の再起票です。これも同じ理由で閉じられました。
- 2026-06-23#70301が起票
過去の報告と調査結果を1つにまとめたissueです。重複候補としてbotが過去の2件を挙げたため、閉じ済みの重複を挙げる仕組みへの指摘がコメントに付きました。
- 2026-08-15検証コメントが付く
v2.1.233で端末層とモデル出力層を分けて確かめた結果が報告されました。
本文の関連issueには、Appleのロゴ(U+F8FF)が出ない#6870と、端末のフォントファミリー設定を求める#48805も挙がっています。U+F8FFもBMPのPUAの末尾にあたる文字です。
症状から原因を引く早見表
| 症状 | 疑う場所 | 次の一手 |
|---|---|---|
Claude Codeの外のprintfでも空白 | 疑う場所端末のフォント | 次の一手端末のフォントにNerd Fontを設定する |
| 外では出るが、statuslineだけ空白 | 疑う場所端末の描画かスクリプト | 次の一手スクリプトを直接実行して出力を確認する |
| Claudeに書かせたスクリプトでアイコンが消える | 疑う場所モデルの出力 | 次の一手エスケープで書き直す |
| Claudeが「アイコンは無い」と答える | 疑う場所Read経由の読み取り | 次の一手BashかPythonでコードポイントを出す |
| デスクトップアプリの端末だけ空白 | 疑う場所別のレンダラー | 次の一手通常の端末で同じ操作を試す |
表の2行目は、statuslineの出力が端末に届いたあとの描画が原因なのか、スクリプトが最初から文字を出していないのかを分ける行です。スクリプトを単体で実行して端末に出るなら、前者です。
端末の描画まわりでは、IDE統合ターミナルに固有の崩れもあります。症状が文字ではなく表示全体の乱れなら、PyCharmの表示崩れの切り分けも参考になります。
まとめ
アイコンが空白でも、フォントの問題とは限りません。自分の端末でClaude Codeの外のprintfが通るなら、残る疑いは「Claudeが書いた文字が最初から入っていない」ことです。
U+E000〜U+F8FFのBMPのPUAは、モデルの出力に入らないと報告されています。Claudeにスクリプトや設定を書かせる場面では、アイコンをエスケープで書き、できあがったファイルをコードポイント単位で確かめると、黙って消える事故を防げます。#70301はstaleのラベルが付いたまま、修正の予定が示されていません。