PHPでSJISの波ダッシュをUTF-8に変換すると全角チルダに変換される問題

まずはこちらのコードを御覧いただきたい。

<?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の場合には要注意でございます。

SNSでシェア