これは エキサイトアドベントカレンダー2022 の記事です
前提
通常、JSONの文字エンコーディングにはUTF-8を使用することになっています。
またphpではjson_encode()
を使うと、デフォルトでは日本語のような文字列は\u65e5
のようにUnicodeの16進数表現にエスケープされます。
だがしかし、文字エンコーディングがWindows-31J
のJSONをphpで作りたい。という時の記事です。
Windows-31J とは?
Shift-JIS
のWindows用の拡張の一種のようです。MS932
とか呼ばれることもあるようです。
Windows-31J
というのは割とJava界隈での呼び方?(筆者の私見です)のようで、phpでいうとSJIS-win
です。
やり方
日本語部分をUnicodeエスケープされないようにしたうえで、mb_convert_encoding()
で変換してやりました。
エンコード時
$data = ['data1' => '日本語'];
$rawJson = json_encode($data, JSON_UNESCAPED_UNICODE);
$result = mb_convert_encoding($rawJson, 'SJIS-win', 'UTF-8');
デコード時
// $encodedStr はSJIS-winのjson文字列とします。
$jsonStr = mb_convert_encoding($encodedStr, 'UTF-8', 'SJIS-win');
$result = json_decode($jsonStr, true);
参考記事