とあるサイトの文字化けを修正した話

とあるサイトの予約ページで、入力した値が全て文字化けしているので修正してほしいとの依頼があった。


確認してみたところ、サイト内の文字は全てShift_JISで扱われているが
POSTされた値がUTF-8で飛んでくるため文字化けが発生している様子。
(PHP5.6から変わったっぽい?)


  • ini_set('default_charset', 'Shift_JIS')

  • mb_internal_encoding('Shift_JIS')

  • <form method='post' accept-charset='Shift_JIS'>

  • Shift_JISに変換するよう色々試してみたがうまくいかず。


    表示する値とPOSTする値を変換したら行けた

    mb_convert_encoding($value, 'Shift_JIS')
    

    しかし、このやり方だと修正箇所が相当な数になってしまうため
    どうしてようかと悩んでいたところ・・・


    便利な関数がありました。

    string mb_convert_variables ( string $to_encoding , mixed $from_encoding , &$vars )

    $to_encoding :変換先の文字エンコード
    $from_encoding:変換元の文字エンコード
    $vars     :変換したい文字列を含む配列


    この関数は配列内の文字列を全て変換したい文字コードに変換してくれます。
    (第3引数は参照渡しの為、代入する必要はない)

    $data = $_POST['data'];
    
    //文字コード変換
    mb_convert_variables('Shift_JIS', 'UTF-8', $data);
    
    ―終了!