JSON が文字化けする理由と Unicode エンコーディングの対処法

2024-12-01

API レスポンスを貼ると日本語や絵文字が崩れる場合、JSON 自体は正常なことが多いです。RFC 8259 ではシステム間 JSON 交換に UTF-8 が必須で、問題はデコード側にあることがほとんどです。

JSON と Unicode

文字列は生の Unicode 文字または \uXXXX エスケープで表現でき、どちらも同じ文字にデコードされます。

RFC 8259 はシステム間で JSON をやり取りする際に UTF-8 を要求します。ローカルファイルも UTF-8 保存を推奨します。

{
  "greeting": "Hello",
  "escaped": "\u0048\u0065\u006c\u006c\u006f",
  "emoji": "🎉"
}

よくある症状

文字が ? や � になる場合、UTF-8 ではなく Latin-1/GBK でデコードされている可能性があります。DB は正常でもエクスポート時に文字化けすることがあります。

\u エスケープ

一部シリアライザーは ASCII 安全のため \u 形式で出力しますが、パース後の文字は正しい Unicode です。修正すべきはエスケープ文字列ではなく伝送エンコーディングです。

HTTP Content-Type

application/json には IANA 上の charset パラメータ定義がありませんが、RFC 8259 に従いバイト列は UTF-8 であるべきです。

クライアント側の回避策より先に、誤ったサーバーヘッダーを修正するのが正攻法です。

BOM の落とし穴

RFC 8259 ではネットワーク上の JSON 先頭 BOM 送信は禁止です。パーサーが無視する場合もありますが依存すべきではありません。

.json は UTF-8 without BOM で保存し、Windows のメモ帳由来の不可視文字に注意してください。

チェックリスト

実バイトが UTF-8 か、エディタ設定が一致しているか、オンライン表示が正しいかを確認し、問題のある下流コンシューマーを修正しましょう。