一覧へEnglish

T04

パイプで渡した日本語が ? になる(claude -p・python・git)

症状

PowerShell から "日本語" | claude -p のように渡すと、相手には ?? が届く。エラーは出ない。Claude なら「文字化けしていたので推測した」と言いながら、指示と違うことをする。

30秒で確かめる

PowerShell(Windows PowerShell 5.1)に貼って実行します。一時フォルダ(%TEMP% の下)にだけファイルを作ります。最後に REPRODUCED と出たら、あなたの PC で起きています。

$d = Join-Path $env:TEMP ('cc-trap-' + (Get-Date -Format 'yyyyMMddHHmmss')); New-Item -ItemType Directory $d -Force | Out-Null
$pyv = & python -c "import sys; print('%d.%d.%d' % sys.version_info[:3])" 2>$null
if (-not $pyv) { 'CANNOT CHECK (python not found, or only the Microsoft Store stub: install Python from python.org)' } else {
"python $pyv"
[IO.File]::WriteAllText("$d\hex.py", 'import sys; print(sys.stdin.buffer.read().strip().hex())')
$s = [string][char]0x65E5 + [char]0x672C
$h = $s | python "$d\hex.py"
"bytes=$h  (UTF-8 would be e697a5e69cac)"
if ($h -match '^(3f)+$') { 'REPRODUCED' } else { 'NOT REPRODUCED' }
}

なぜ起きるか

Windows PowerShell 5.1 は、ネイティブのプログラムへパイプで渡す文字を $OutputEncoding で符号化する。既定は ASCII なので、日本語は ? になる。受け取る側の [Console]::OutputEncoding とは別の設定。

直し方

長い日本語は UTF-8 のファイルに書き、ASCII だけの指示で「このファイルを読んで」と渡す。保険として $OutputEncoding を UTF-8 にする。

$OutputEncoding = New-Object System.Text.UTF8Encoding $false
'Read C:/work/prompt.md and do exactly what it says.' | claude -p

作者の PC での結果

バイト 3f3f(? が2つ)

作者の PC: Windows 11 / Windows PowerShell 5.1.26100 / Python 3.13.7 / Claude Code 2.1.304、日本語の Windows(コードページ 932)。2026-10-20〜22 に確認。

こんな言葉で探した人へ

関連

この穴を最初から踏まないようにした部品(書き込み先を絞る安全装置〈onFailure: block 付き〉、夜の無人実行、ファイルとフックの設定を調べる健康診断、CLAUDE.md の型、試験一式)は cc-win-kit にまとめています。

cc-win-kit 英語版(Payhip、19ドル。日本語版は 2026年10月31日に note で公開)

ほかの症状