生成AI入門 2026.06.06

Claude Codeで日本語が文字化けする原因と解決方法|マルチバイト文字エラー対策【2026年版】

タグ:Claude Code / トラブルシューティング / 文字化け対策 / マルチバイト文字 / エラー解決

ひとことで言うと

Claude Codeのフック(hook)で日本語やマルチバイト文字が消える・文字化けする問題は、文字エンコーディングの設定ミスと無音エラー(エラーメッセージが表示されずにこっそり失敗する状態) が主な原因です。エラーハンドリングを強化してログを確認し、エンコーディングをUTF-8に統一すれば解決します。

Claude Codeのフック機能で日本語が消える仕組み

Claude Codeを使ってコード生成や自動実行を行う際、フックという仕組みを使うことがあります。フックは外部のプログラムやスクリプトと連携する機能のことです。

このフック機能には、**日本語などのマルチバイト文字(複数のバイトで1文字を表現する文字)が正しく処理されないという厄介なトラブルがあります。何が厄介かというと、エラーメッセージが出ずに、ただ文字が消えてしまうことです。これを「無音エラー」と呼びます。

たとえば、こんな状況が起きます:

  • Claudeにテキスト処理のコード生成を依頼した
  • 日本語を含むファイルを作成するはずだった
  • でも実際に作られたファイルを見ると、日本語の部分が空白か「???」になっている
  • エラーメッセージは一切出ていない

このせいで「何が起きたのかわからない」まま時間を浪費することになります。

原因1:エンコーディングの不一致

Claude Codeが扱うテキストデータは、コンピュータの中では「バイト列」という0と1の羅列で保存されています。この羅列をどのように文字に変換するかのルールを「エンコーディング」と呼びます。

日本語を含まないテキストなら、シンプルなASCIIという規格でも大丈夫です。でも日本語を扱う場合は、複数の文字を正確に変換する必要があり、UTF-8という規格が標準です

しかし、Claude Codeのフックが次のような状態だと、文字化けが起きます:

  • フック内部でのエンコーディング設定がUTF-8ではなく、Shift-JISやEUC-JPなど別の規格になっている
  • ファイル読み込み時の指定がUTF-8になっていない
  • 外部プログラムへのデータ渡し時にエンコーディングが指定されていない

特に、Claudeが生成するコードが複数のプログラミング言語や処理系を組み合わせている場合、各段階でエンコーディングがズレるリスクが高まります。

原因2:無音エラー(サイレントフェイル)

もう1つの大きな原因が、エラーが発生しても、何もメッセージが表示されない仕様になっていることです

Claude Codeが外部のスクリプトやAPIと連携するとき、処理がうまくいかなかった場合、ふつうなら画面に警告やエラーメッセージが出ます。でも、特定の条件下では:

  • エラーが内部で処理されて、ユーザーに知らされない
  • 処理が強制終了するのではなく、「適当に続行」してしまう
  • 結果として、データの一部(特にマルチバイト文字)だけが消える

このため、「ファイルはできているけど、何か不完全」という状態になり、原因を特定するのに時間がかかります。

エラーの見つけ方:ログを確認する

無音エラーを発見するには、ログ(実行履歴)を詳しく確認することが第一歩です

ステップ1:コンソール出力を有効にする

Claude Codeのフック内で、途中途中の処理結果を出力する「print文」や「console.log」などを仕込みます。これにより、どの時点で何が起きているのかが見える化されます。

// JavaScriptの例
console.log("入力テキスト:", inputText);
console.log("エンコーディング:", new TextEncoder().encode(inputText));

ステップ2:エラーハンドリングを強化する

外部プログラムやAPI呼び出しの周りに、try-catchという「エラー捕捉」の仕組みを入れます。これにより、失敗時に具体的なエラー内容が記録されます。

try {
  // 処理
} catch (error) {
  console.error("エラーの詳細:", error.message);
}

ステップ3:文字数・バイト数を確認する

処理前後で、テキストの文字数とバイト数を比較します。文字数は変わらないのにバイト数が減っていれば、マルチバイト文字が削られている証拠です。

const text = "こんにちは";
console.log("文字数:", text.length);
console.log("バイト数:", new Blob([text]).size);

解決策1:エンコーディングをUTF-8で統一する

フック内で扱うすべてのテキスト処理を、UTF-8で統一する のが最も確実です。

Pythonを使う場合

# ファイル読み込み時に明示的にUTF-8を指定
with open("input.txt", "r", encoding="utf-8") as f:
    text = f.read()

# ファイル書き込み時もUTF-8を指定
with open("output.txt", "w", encoding="utf-8") as f:
    f.write(text)

JavaScriptを使う場合

// Node.jsでファイル操作するとき
const fs = require("fs");
const text = fs.readFileSync("input.txt", "utf-8");
fs.writeFileSync("output.txt", text, "utf-8");

JSONデータを扱う場合

JSON形式でデータをやり取りする際は、デフォルトでUTF-8になっているので、わざわざ指定する必要はありません。ただし、JSONファイルを保存するときはテキストエディタで「UTF-8 BOM なし」を指定しましょう。

解決策2:フックの出力結果を検証する

Claude Codeが生成したコードが実際に正しく動作しているか、結果を確認する仕組みを入れます

チェックリスト

  • ファイルが作成されたか、大きさは期待値か
  • テキストの文字数は期待値と同じか
  • ログに異常な値が記録されていないか
  • 外部プログラム呼び出しの戻り値(終了コード)は0か(0=成功)

実際のコード例(Python):

import os
import subprocess

# 処理実行
result = subprocess.run(["some_command"], capture_output=True, text=True)

# 検証
if result.returncode != 0:
    print(f"エラー発生: {result.stderr}")
else:
    output = result.stdout
    print(f"出力文字数: {len(output)}")
    print(f"出力内容: {output}")

解決策3:Claudeへの指示を具体的にする

Claude Codeに頼むときの質問やプロンプト(指示文)を、より具体的にすることで、エラーの起きにくいコードが生成されます。

おすすめの指示方法

  • 「日本語テキストを扱うので、ファイル読み込み時とスクリプト内で必ずUTF-8を指定してください」
  • 「処理の各ステップでエラーハンドリングを入れてください」
  • 「実行結果をログに出力して、正常に完了したか確認できるようにしてください」
  • 「外部コマンドを使う場合、終了コードで成功を確認してください」

こうすることで、Claudeも「日本語扱うんだな、気をつけよう」と意識してコード生成をします。

よくあるエラーメッセージと対処法

「UnicodeDecodeError」が出た場合

ファイルを読み込むときにエンコーディングが合っていません。

# 間違い
with open("file.txt", "r") as f:  # エンコーディング指定なし
    text = f.read()

# 正し
with open("file.txt", "r", encoding="utf-8") as f:
    text = f.read()

「UnicodeEncodeError」が出た場合

ファイルに書き込むときにエンコーディングが合っていません。

# 正しい方法
with open("file.txt", "w", encoding="utf-8") as f:
    f.write(text)

文字が「□」や「?」に見える場合

ファイルは正しく保存されていますが、テキストエディタが間違ったエンコーディングで開いています。エディタの「文字コード」または「エンコーディング」メニューからUTF-8を選択し直してください。

トラブル診断フローチャート

  1. ファイルは作成されたか?

    • 作成されていない → フック自体が失敗。コンソールログを確認
    • 作成されている → 次へ
  2. ファイルサイズは期待値か?

    • 明らかに小さい → マルチバイト文字が削られている可能性が高い
    • 期待値に近い → 次へ
  3. テキストエディタで開いて文字は正しく見えるか?

    • 見えない、化けている → テキストエディタの文字コード設定をUTF-8に変更
    • 見える → 処理は成功している。別の問題の可能性
  4. コンソールログにエラーや警告は記録されているか?

    • 記録されている → そのエラーメッセージで検索、または対応する
    • 記録されていない → フック内部でのエンコーディング設定を確認

予防策:テンプレートコードを使い回す

毎回同じ対策をするのは手間なので、日本語対応済みのテンプレートコードを用意して使い回す のが効率的です。

Claude Codeに「以下のテンプレートを使ってコード生成してください」と貼り付ければ、生成されるコードも同じ規格に従います:

Python テンプレート

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import logging

# ログ設定
logging.basicConfig(level=logging.DEBUG)

def main():
    try:
        # ここに処理を書く
        pass
    except Exception as e:
        logging.error(f"エラー: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()

Node.js(JavaScript)テンプレート

const fs = require("fs");

try {
  // ここに処理を書く
} catch (error) {
  console.error("エラー:", error.message);
  process.exit(1);
}

このテンプレートに従えば、エンコーディング関連のトラブルは大幅に減ります。

まとめ:Claude Codeの日本語トラブルは「検証とログが鍵」

Claude Codeで日本語が文字化けする理由は、シンプルに言うと次の3つです:

  1. エンコーディング設定がUTF-8になっていない
  2. エラーが出てもユーザーに知らされない(無音エラー)
  3. Claudeの生成コードが日本語対応を想定していない

対策は:

  • ファイル読み書き時に明示的に encoding="utf-8" を指定する
  • 処理のそれぞれのステップでログを出力して、何が起きたか見える化する
  • Claudeへの質問で「日本語を扱う」「マルチバイト文字対応」と明記する
  • テンプレートコードを用意して、使い回す

特に重要なのは、エラーが出ていないから大丈夫ではなく、実際の結果を確認する ことです。テキスト処理系のバグは目立たないので、「できたはずの処理の結果が何か変」と感じたら、ログと出力ファイルを細かく調べる習慣をつけましょう。


あわせて読みたい

参考ソース