まずはこちらのコードを御覧いただきたい。
<?php
$json = [
"U+301C" => "〜",
"U+FF5E" => "~"];
echo json_encode($json);
mb_convert_variables('SJIS-win','UTF-8',$json); // 配列の文字コードをUTF-8→SJIS-winに変換
mb_convert_variables('UTF-8','SJIS-win',$json); // 配列の文字コードをSJIS-win→UTF-8に変換
echo json_encode($json);
?>
5行目のechoと8行目のechoは同じものを出力する。
そう信じてました、、、ついさっきまで。
だって、UTF-8にしたものをS-JISにしてもう1回UTF-8に戻しただけじゃないですか!
しかしながら出力はこうなります。
<?php
$json = [
"U+301C" => "〜",
"U+FF5E" => "~"];
echo json_encode($json); // {"U+301C":"\u301c","U+FF5E":"\uff5e"}
mb_convert_variables('SJIS-win','UTF-8',$json); // 配列の文字コードをUTF-8→SJIS-winに変換
mb_convert_variables('UTF-8','SJIS-win',$json); // 配列の文字コードをSJIS-win→UTF-8に変換
echo json_encode($json); // {"U+301C":"\uff5e","U+FF5E":"\uff5e"}
?>
ちょっとまって、なんで行って戻ってしただけで、文字が変わってるんですか!?
波ダッシュ「これってもしかして…」
全角チルダ「私たち、身体が…」
「「入れ替わってる〜!?」」
ちょっとふざけてる場合じゃないよ。
ちなみにこの現状は、SJIS→UTF-8の変換時に発生しているみたいなので、dbがSJISでフロントがUTF-8の場合には要注意でございます。