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 か、エディタ設定が一致しているか、オンライン表示が正しいかを確認し、問題のある下流コンシューマーを修正しましょう。