はじめに
最近 Claude Code を日本語環境で使用していると、突然クラッシュするという現象に遭遇しています。2025年12月15日にリリースされた v2.0.70 以降で発生している深刻なバグです。
実際のクラッシュ例
具体的な発生例を見てみましょう。下記は私の環境で発生したログです。
byte index 20 is not a char boundary; it is inside '。' (bytes 18..21) of `パターンです。v2.0.70のメモリ最適化またはDiff表示修正が原因と`
このエラーは、「パターンです」の直後にある句点 。(3バイト文字)の内部、具体的にはバイト20の位置で文字列を分割(スライス)しようとして失敗したことを示しています。
報告されている「危険な文字」
特に以下の文字を含むテキスト処理時にクラッシュが多発しています。
| カテゴリ | 文字例 | 発生状況 |
|---|---|---|
| 日本語 |
。(句点) |
文末の処理で頻発 |
| 漢字 |
済、正、発
|
特定のバイト境界と重なった場合 |
| 記号 |
()(全角括弧) |
Markdownの太字 ** と組み合わさると危険 |
| 韓国語 |
용、필터 적용
|
ハングル全般 |
原因:Rust製バイナリにおけるUTF-8処理の不備
エラーログから判明した「Rust」の使用
このバグによって、 Claude Code のコア部分が Rust で実装されている ことが明らかになりました。
thread '<unnamed>' panicked at /rustc/.../library/core/src/str/mod.rs:833:21
これまで Claude Code は npm install で配布されるため、Node.js (JavaScript/TypeScript) 製だとも思われていました。
npm パッケージの中身
// (c) Anthropic PBC. All rights reserved.
// Version: 2.0.76
// Want to see the unminified source? We're hiring!
// https://job-boards.greenhouse.io/anthropic/jobs/4816199008
import{createRequire as Ez9}from"node:module";var Vz9=Object.create...
npmパッケージには以下が含まれています:
-
cli.js- 11MB のバンドル済みESM JavaScript (読解不能) -
resvg.wasm- SVGレンダリング用WebAssembly -
tree-sitter-bash.wasm- Bashパーサー -
tree-sitter.wasm- 汎用パーサー
スタンドアロンバイナリ
私は homebrew でインストールしているので、そちらも確認してみました。
$ file ~/.local/share/claude/versions/2.0.76
Mach-O 64-bit executable arm64
$ strings ~/.local/share/claude/versions/2.0.76 | grep rustc
/rustc/c61a3a44d1a5bee35914cada6c788a05e0808f5b/library/core/src/str/mod.rs
スタンドアロン版は完全なRustバイナリです。
技術的なメカニズム
Rust の文字列(String / &str)は UTF-8 エンコーディングを採用しています。UTF-8 において、文字のバイト数は可変です。
- ASCII文字(英数字): 1バイト
- 日本語・韓国語: 3バイト
- 絵文字: 4バイト
Rust では、文字の境界(Char Boundary)ではないバイトインデックス で文字列をスライスしようとすると、メモリ安全性を守るためにプログラムがパニック(強制終了)します。
// 問題のあるコードのイメージ
let s = "完了。";
// "完"(3bytes) + "了"(3bytes) + "。"(3bytes) = 合計9bytes
// インデックス7でスライスしようとする
// "。" はバイト6〜8の範囲にあるため、バイト7は文字の「途中」
let slice = &s[0..7];
// -> thread panicked at 'byte index 7 is not a char boundary...'
v2.0.70 では行われた「メモリ最適化」や「Diff表示の改善」が行われましたが、この過程で、マルチバイト文字を考慮しないバイト単位の文字列操作(例えば表示幅を揃えるためのカット処理など)が混入したと考えられます。
トリガーとなるパターン
ユーザーの報告から、以下のパターンでクラッシュしやすいことが分かっています。
-
Markdown太字 + 全角括弧
-
**完了**(備考)のような並び。太字パース処理と全角文字の境界計算が衝突している可能性があります。
-
-
TodoWrite ツールでの日本語出力
- Claude がタスク管理ツール
TodoWriteを使用し、「タスク: レビュー完了(修正済)」のように日本語で記述しようとした瞬間に落ちます。
- Claude がタスク管理ツール
回避策:CLAUDE.md によるガードレール
この問題の厄介な点は、ユーザーが入力した文字ではなく、Claude Code 自身が生成・表示しようとした文字 でクラッシュする点です。
そのため、ユーザー側でできる最善の策は、プロジェクトのルート(または ~/.claude/)にある CLAUDE.md にルールを記述し、Claude に「クラッシュする文字パターンを使わせない」ように指示すること です。
私は以下の内容を CLAUDE.md に追記しました。全角括弧の使用回避や、太字直後のスペース挿入を徹底させます。しかし、完全にClaude Codeの挙動をコントロールできるわけではないので解決には至っていません。
# Claude Code Known Issues & Guardrails
## UTF-8 Multibyte Character Panic (Issue #14133)
**Context**: Claude Code v2.0.70+ has a bug in Rust string slicing causing crashes on multi-byte characters.
### Critical Guardrails
Please follow these rules strictly to prevent the CLI from crashing:
1. **No Full-width Parentheses**:
- ❌ `(補足)` `(済)`
- ✅ `(補足)` `(済)`
- Always use half-width `()` in explanations, todo items, and commit messages.
2. **Bold Formatting Safety**:
- Do not place multi-byte characters immediately after bold text.
- ❌ `**完了**です`
- ✅ `**完了** です` (Insert a space)
3. **TodoWrite Usage**:
- When adding tasks via `TodoWrite`, avoid full-width symbols in the description.
### Rule
**Replace all full-width `()` with half-width `()` in your output.**
その他の対策
確実に回避したい場合はダウングレードが確実です。
# v2.0.69 へのダウングレード
npm install -g @anthropic-ai/claude-code@2.0.69
発生バージョンと経緯
このバグは v2.0.70 で混入しました。
| バージョン | リリース日 | 状況 | 備考 |
|---|---|---|---|
| v2.0.69 | 〜2025-12-15 | ✅ 安定 | このバージョンまでは問題なし |
| v2.0.70 | 2025-12-15 | ❌ 発生 | メモリ最適化・Diff改善リリース |
| v2.0.75 | 2025-12-20 | ❌ 発生 | 本記事執筆時点の最新版でも継続中 |
GitHub Issue では現在 oncall ラベルが付与されており、開発チームによる修正作業が進行中と思われます。
まとめ
- 現象: Claude Code v2.0.70以降で、日本語などのマルチバイト文字を含む特定の出力を行うとクラッシュする。
- 原因: 内部で使用されている Rust バイナリにおける、UTF-8 文字列スライスの実装ミス。
-
回避策:
CLAUDE.mdに「全角括弧を使わない」「太字の後にスペースを入れる」といったルールを記述し、Claude 側の出力を制御する。