JAVASCRIPTのatobで日本語(UTF8)でbase64_encodeされた文字列をデコードすると文字化けする問題を回避するコードをご紹介いたします。
PHPでbase64_encodeされた日本語をJAVASCRIPTのatobで複合化すると文字化けする
ワードプレスでAJAXなどでbase64エンコードされた文字列をやり取りすることがあるかと存じます。
ただ、この文字列をJAVASCRIPTのatob等のbase64関連の関数と組み合わせて使用する場合は注意が必要です。
例としまして下記のようなコードを実行して出力すると文字化けしてしまう場合がございます。
<script> var string = "<?php echo base64_encode("日本語");?>"; document.open(); document.write(atob(string)); document.close(); </script>
これは、JAVASCRIPTとPHPのbase64関連の関数でのマルチバイト文字の取り扱いが違うからです。
この為JAVASCRIPT側で日本語をbase64デコードする特殊な関数を定義してそれを使用します。
<script> function b64DecodeJP(str) { return decodeURIComponent(atob(str).split('').map(function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); } var string = "<?php echo base64_encode("日本語");?>"; document.open(); document.write(b64DecodeJP(string)); document.close(); </script>
これで日本語も文字化けせずにbase64デコードできるようになりました。
参考
Using Javascript’s atob to decode base64 doesn’t properly decode utf-8 strings
WordPress ワードプレスのテーマやプラグインの修正やコーディングのご依頼・ご相談はWPドクターまでお気軽にお送りください