0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claudeでファイルアップロードすると日本語が文字化けする問題と回避策【解決…してないです】

Last updated at Posted at 2025-09-07

(2025/10/**) 依然この問題は残ってます

どの様な切り分けになっているか分りませんので、チャットやプロジェクトにアップしたファイルをプレビューで確認しないといけないです。

(2025/09/10)

Claudeからアーティファクトのアップデートがあったと通知があったので、テストしたら問題は解消されているようです。
僕はアンソロピック社を信じていましたよ。。。


Anthropic社はマルチバイト圏に親を殺されでもしたのでしょうか?

1. はじめに

私はAIチャットサイトのClaudeをゴリゴリに使ってるのですが、数日前より日本語のテキストファイルをアップロードしたら、チャットのスレッドやプロジェクトへ登録されたファイル内容が文字化けして読めなくなった現象が出るようになりました。

「残念ながらファップロードいただいているファイルが文字化けして読めないようです」

…なんで?

私はコーディング規則なんかをプロジェクトのナレッジに上げてスレッドでコード生成の依頼をしたりする訳なんですが、いつものように以下の文章をアップロードすると文字化けを起こしているではないか。

■コーディング規則と注意点
・必要なら文字化け対策をすること
・ファイル名やフォルダ名などデータに日本語対応処理を
・命名規則は使用する言語の推奨命名規則に従うこと。特になければ変数名、関数名などにスネークケースを使用
・コメントを適宜詳しく表記
・不必要なクラスは作らない事
・関数中心の構成で

「■コーディング規則と注意点」が「■コーディング規則と注意点」のような謎の文字列に化けて、以下も続く。

最初はファイルのエンコを疑ったのですが、確認すると確実にUTF-8で保存されています。

そこで、様々な実験をしてみて、 「最初の数行でのASCIIと日本語文字の割合で文字コードの自動判別している」 という条件にたどり着きました。


これなら文字化けしない(拡張子関係なし)

■コーディング規則と注意点
・必要なら文字化け対策をすること
・ファイル名やフォルダ名などデータに日本語対応処理を
・命名規則は使用する言語の推奨命名規則に従うこと。特になければ変数名、関数名などにスネークケースを使用
・コメントを適宜詳しく表記
・不必要なクラスは作らない事
・関数中心の構成で

 ```python
import os
# 日本語パス対応の処理例
file_path = "D:/作業フォルダ/データ.txt"
print(f"処理中: {file_path}")
 ```

2. Claude Codeでの不具合報告

この件でClaudeのレポートなどで調査したところ、興味深い事が。
※Claudeの不具合をClaudeに調査させる…皮肉が効いてますが、私の利用トークン、がっつり消費しています。


Claude Code(Anthropicが提供するCLIツール)では、2024年11月頃から同様のUTF-8文字化け問題が報告されていました

GitHub Issuesでの報告例

  • Issue #1716: UTF-8 Corruption Bug
  • Issue #2154: MultiEdit UTF-8 Encoding Bug Report
  • Issue #5111: Sub-agents write files with incorrect encoding on macOS

これらの報告では、中国語、日本語、ロシア語などのマルチバイト文字が「�」(置換文字)に変換される問題が確認されています。

3. 日本語コミュニティの反応

Twitter(X)でも以下のような報告が見られました:

  • 「Claude Codeくんちょいちょい文字化けするけどなぜ」
  • 「Claude Code が文字化けファイルを作成してくるんだけど」

特に日本では、SJIS(Shift_JIS)とUTF-8の変換問題が深刻で、レガシーシステムのコードを扱う際に大きな問題となっているようです。
ですが、ClaudeのWebインターフェースでは、同様の報告は見つかりませんでした。

これは私の推測ですが、おそらくアンソロピック社が段階的ロールアウトしたのかなと。


1.Claude Codeで新しいエンコーディング判定ロジックを先行実装
 ・より「効率的」または「セキュア」な処理を目指した変更
 ・しかし、マルチバイト文字の判定に問題があった

2.問題があったまま、同じロジックをClaude.aiにも適用


年初のあたりでおそらく日本語コミュニティーだけでなくマルチバイト文字使っている文化圏で影響が出てたはずですが、無視されたんでしょうかね。みなさん。足下見られてますよ。

好意的に見たら、コードの共通化や統一化の一環としてClaude Codeでの問題が完全に解決される前に展開された可能性もありますが。

4. 応急処置

実験を重ねた結果、以下の原因と対処法を特定しました。

原因の特定【改訂】

新たに判明した文字化けの法則?

Claudeは「ファイルの最初の8-10行程度」をサンプリングしてエンコーディングを自動判定しているようです。
ファイルの最初の数行でのマルチバイト文字とASCII文字の割合で、拡張子に関係なく文字化けします。
ASCIIとマルチバイト文字の順序も関係ありませんでした。

効果的な回避策

1. ファイルの先頭に必ずASCII文字を入れる

様々な検証より、テキスト修正での小細工では、回避できる可能性が低いと判断しましたので、非推奨です。

2. BOM付きUTF-8で保存する

確実な方法です。

VScodeに、(UTF-8 with BOM)という保存モードがあるので、それで保存すればマルチバイトで始まっても正常に表示されます。手持ちのエディタにBOM付きUTF-8で保存する方法がなければ以下のPowerShellのツールを使って変換してください。

拡張子".ps1"で保存して実行です。

# BOM付きUTF-8変換ツール for Claude文字化け対策
# 作成者: ya-man-kys
# 用途: ClaudeにアップロードするテキストファイルをBOM付きUTF-8に変換

Write-Host "`n====================================" -ForegroundColor Cyan
Write-Host "  BOM付きUTF-8変換ツール" -ForegroundColor Yellow
Write-Host "  Claude文字化け対策用" -ForegroundColor Yellow  
Write-Host "====================================" -ForegroundColor Cyan
Write-Host ""

# パス検証関数
function Validate-InputPath {
    param([string]$Path)
    
    # 前後の空白とクォートを除去
    $Path = $Path.Trim()
    $Path = $Path.Trim('"')
    $Path = $Path.Trim("'")
    
    # 空文字チェック
    if ([string]::IsNullOrWhiteSpace($Path)) {
        throw "パスが入力されていません"
    }
    
    # ファイルの存在確認
    if (-not (Test-Path $Path -PathType Leaf)) {
        throw "指定されたファイルが見つかりません: $Path"
    }
    
    # 拡張子チェック(テキストファイルのみ)
    $extension = [System.IO.Path]::GetExtension($Path)
    $textExtensions = @(".txt", ".md", ".py", ".js", ".json", ".xml", ".csv", ".html", ".css", ".yml", ".yaml")
    if ($extension -notin $textExtensions) {
        Write-Host "警告: このファイルはテキストファイルではない可能性があります" -ForegroundColor Yellow
        Write-Host "続行しますか? (y/n): " -NoNewline -ForegroundColor Yellow
        $confirm = Read-Host
        if ($confirm -ne 'y' -and $confirm -ne 'Y') {
            throw "処理を中止しました"
        }
    }
    
    return $Path
}

# 出力パス生成関数
function Generate-OutputPath {
    param([string]$SourcePath)
    
    $directory = [System.IO.Path]::GetDirectoryName($SourcePath)
    $filename = [System.IO.Path]::GetFileNameWithoutExtension($SourcePath)
    $extension = [System.IO.Path]::GetExtension($SourcePath)
    
    # デフォルトの出力名
    $outputPath = Join-Path $directory "$($filename)_BOM$($extension)"
    
    # ファイルが既に存在する場合は番号を付ける
    $counter = 1
    while (Test-Path $outputPath) {
        $outputPath = Join-Path $directory "$($filename)_BOM_$($counter)$($extension)"
        $counter++
    }
    
    return $outputPath
}

# BOM確認関数
function Check-BOM {
    param([string]$FilePath)
    
    if (-not (Test-Path $FilePath)) {
        return "ファイルなし"
    }
    
    $bytes = [System.IO.File]::ReadAllBytes($FilePath)
    if ($bytes.Length -ge 3 -and 
        $bytes[0] -eq 0xEF -and 
        $bytes[1] -eq 0xBB -and 
        $bytes[2] -eq 0xBF) {
        return "BOM付きUTF-8"
    } else {
        return "BOMなし"
    }
}

# メイン処理
$success = $false
while (-not $success) {
    try {
        # 変換元ファイルのパス入力
        Write-Host "変換したいテキストファイルのパスを入力してください:" -ForegroundColor Green
        Write-Host "(Windowsエクスプローラーからドラッグ&ドロップ可能)" -ForegroundColor Gray
        $sourcePath = Read-Host
        $sourcePath = Validate-InputPath -Path $sourcePath
        
        # 元ファイルのBOM状態確認
        $originalBomStatus = Check-BOM -FilePath $sourcePath
        Write-Host "`n元ファイルの状態: $originalBomStatus" -ForegroundColor Cyan
        
        if ($originalBomStatus -eq "BOM付きUTF-8") {
            Write-Host "このファイルは既にBOM付きUTF-8です" -ForegroundColor Yellow
            Write-Host "それでも変換を続けますか? (y/n): " -NoNewline -ForegroundColor Yellow
            $confirm = Read-Host
            if ($confirm -ne 'y' -and $confirm -ne 'Y') {
                Write-Host "処理を中止しました" -ForegroundColor Gray
                continue
            }
        }
        
        # 出力先の確認
        $outputPath = Generate-OutputPath -SourcePath $sourcePath
        Write-Host "`n出力先: $outputPath" -ForegroundColor Cyan
        Write-Host "このパスでよろしいですか? (y/n/カスタムパス入力): " -NoNewline -ForegroundColor Green
        $outputConfirm = Read-Host
        
        if ($outputConfirm -ne 'y' -and $outputConfirm -ne 'Y' -and $outputConfirm -ne 'n' -and $outputConfirm -ne 'N') {
            # カスタムパスが入力された場合
            $outputPath = $outputConfirm.Trim().Trim('"').Trim("'")
            if ([string]::IsNullOrWhiteSpace($outputPath)) {
                throw "出力パスが無効です"
            }
        } elseif ($outputConfirm -eq 'n' -or $outputConfirm -eq 'N') {
            Write-Host "処理を中止しました" -ForegroundColor Gray
            continue
        }
        
        # ファイル内容を読み込み
        Write-Host "`n処理中..." -ForegroundColor Yellow
        $content = Get-Content $sourcePath -Raw -Encoding UTF8
        
        # BOM付きUTF-8として保存
        $utf8WithBom = New-Object System.Text.UTF8Encoding($true)
        [System.IO.File]::WriteAllText($outputPath, $content, $utf8WithBom)
        
        # 結果表示
        Write-Host "`n====================================" -ForegroundColor Green
        Write-Host "  変換完了!" -ForegroundColor Green
        Write-Host "====================================" -ForegroundColor Green
        
        # BOM確認
        $newBomStatus = Check-BOM -FilePath $outputPath
        Write-Host "変換後の状態: $newBomStatus ✓" -ForegroundColor Green
        
        # ファイルサイズ比較
        $originalSize = (Get-Item $sourcePath).Length
        $newSize = (Get-Item $outputPath).Length
        $sizeDiff = $newSize - $originalSize
        
        Write-Host "`nファイルサイズ:" -ForegroundColor Cyan
        Write-Host "  元ファイル: $originalSize バイト"
        Write-Host "  新ファイル: $newSize バイト"
        if ($sizeDiff -eq 3) {
            Write-Host "  差分: +3 バイト (BOM追加分)" -ForegroundColor Green
        } else {
            Write-Host "  差分: $sizeDiff バイト" -ForegroundColor Gray
        }
        
        Write-Host "`n出力ファイル:" -ForegroundColor Cyan
        Write-Host $outputPath -ForegroundColor White
        Write-Host "`nこのファイルをClaudeにアップロードしてください" -ForegroundColor Yellow
        
        $success = $true
        
    } catch {
        Write-Host "`nエラー: $($_.Exception.Message)" -ForegroundColor Red
        Write-Host "もう一度試しますか? (y/n): " -NoNewline -ForegroundColor Yellow
        $retry = Read-Host
        if ($retry -ne 'y' -and $retry -ne 'Y') {
            Write-Host "プログラムを終了します" -ForegroundColor Gray
            break
        }
        Write-Host ""
    }
}

# 続けて変換するか確認
if ($success) {
    Write-Host "`n別のファイルも変換しますか? (y/n): " -NoNewline -ForegroundColor Cyan
    $continue = Read-Host
    if ($continue -eq 'y' -or $continue -eq 'Y') {
        # 自身を再実行
        & $MyInvocation.MyCommand.Path
    } else {
        Write-Host "`n====================================" -ForegroundColor Cyan
        Write-Host "  ご利用ありがとうございました" -ForegroundColor Yellow
        Write-Host "====================================" -ForegroundColor Cyan
    }
}

3. テキストを直接コピー&ペースト(確実だが手間)

ファイルアップロードを避け、エディタから直接Claudeのチャット欄にペーストする。

推測される技術的原因

おそらくClaude側のファイルアップロード処理が、BOMなしUTF-8ファイルのエンコーディングを自動判定する際に失敗していると考えられます:

  • ファイルの最初の数バイトを見てエンコーディングを推測
  • ファイルの最初の一定のバイト数からエンコーディングを判断
  • ASCII文章と判定すると、UTF-8ではなくLatin-1やWindows-1252として誤認識
  • 結果として文字化けが発生

4. Anthropic社への報告はどこで?

この問題をAnthropicに報告したいのですが、適切な報告先が見つかりません。

  • 公式サポート: https://support.anthropic.com (英語必須)
  • GitHub Issues: Claude Code用のみ(Claude.ai用は見当たらず)
  • 公式フォーラム: 明確な報告窓口が不明

正直、私ポンコツなんで英語まるでダメなんです。翻訳AIを使う手がありますが、受け答えになるとお手上げなので。。。私には無理です。

ですが、これは明らかに国際化対応の問題であり、日本語圏のユーザーだけでなく、中国語、韓国語、アラビア語など、世界中のマルチバイト文字を使うユーザーに影響する問題です。

もしこの問題が改善されなければ、月額100ドルのMAXプランを解約することも検討せざるを得ません。
…てな事はなく、Claudeがなければ私何にもできないので、大人しく仕様を受け入れてちまちま対策するんでしょうね。

もうアンソロピック社の下僕です。


まとめ

Claude.aiでファイルアップロード時に日本語が文字化けする問題は、ファイルの先頭がマルチバイト文字で始まる場合ファイル先頭から一定の文字量をサンプリングしてASCIIと判断された場合に発生します。

当面の回避策として、BOM付きUTF-8ファイルに変換することで問題を回避できます。

この問題についてAnthropicからの公式見解や修正予定は確認できていませんが、Claude Codeでは数ヶ月前から同様の問題が報告されており、根本的な解決が待たれます。

誰かアンソロピックにご注進してくんないかなぁ。。。(他力本願)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?