[BUG] BMP Private Use Area Unicode characters (U+E000-U+F8FF) silently stripped from tool I/O

Resolved 💬 3 comments Opened Apr 7, 2026 by malob Closed Apr 10, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report
  • [x] I am using the latest version of Claude Code

What's Wrong?

Claude Code silently strips all Unicode characters in the BMP Private Use Area range (U+E000-U+F8FF) from tool inputs and outputs. This makes it impossible to read, write, or edit files containing these characters without data loss.

Characters in the Supplementary PUA-A range (U+F0000-U+FFFFD) are unaffected.

The most common victim is Nerd Font icons: Powerline, Font Awesome, Devicons, Weather, and Octicons all fall in the filtered range. Material Design Icons (U+F0000+) work fine. This is a major issue when editing terminal configurations (starship, fish, kitty, WezTerm, etc.).

What Should Happen?

BMP PUA characters should be preserved in tool I/O, just like Supplementary PUA-A characters already are. Reading a file and writing it back should not lose data.

Steps to Reproduce

  1. Create a test file with both BMP and Supplementary PUA characters:

``bash
printf 'BMP PUA U+E0A0: \uE0A0\nSupp PUA U+F0A9E: \U000F0A9E\n' > /tmp/pua-test.txt
``

  1. Ask Claude Code: "Read /tmp/pua-test.txt and write it back to /tmp/pua-roundtrip.txt unchanged"
  2. Compare:

``bash
diff <(xxd /tmp/pua-test.txt) <(xxd /tmp/pua-roundtrip.txt)
``

  1. Result: U+E0A0 (bytes ee 82 a0) is missing from the round-trip. U+F0A9E (bytes f3 b0 aa 9e) is preserved.

The exact boundary: every codepoint in U+E000-U+F8FF is stripped. U+F0000+ is preserved.

Error Messages/Logs

No error is shown. Characters are silently dropped — no warning, no placeholder, just data loss.

Is this a regression?

No, this never worked.

Claude Code Version

2.1.92 (Claude Code)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Other (Ghostty)

Additional Information

Previously reported as #9907 (auto-closed due to inactivity, not because it was fixed). My investigation and workaround are documented in that issue's comments.

Workaround plugin using placeholder syntax ({{U+E0A0}} / {{nf-pl-branch}}) and PostToolUse hooks for automatic conversion: pua-unicode plugin

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗