base64_decodeの文字化けをどーにかしたい

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
どーにかしたい全六巻絶賛発売中だぜ!

この記事を三行にまとめると

どーしても日本語が文字化けしてしまう
URLセーフってやつを疑ってみると良いと思います
どーにかしたいっていう漫画あったよね
PHPの「base64_decode()」を使ってBase64の文字をデコードする際に、どーしても日本語が文字化けしてしまうことがある。

例えばGmailのAPIを使ってメールを取得するとBase64にエンコードされたデータが返ってくるのですが、単にbase64_decode()でデコードするだけだと文字化けすることがある。

あの天下のグーグルさんがエンコードをミスってるとも思えないし、文字コードの問題かな?と思ってmb_convert_encoding()をかませてみるも特に状況は変わらず。

そういう時はURLセーフってやつを疑ってみると良いと思います。

例えばurlencode()を使ってURLをエンコードすると「+」や「/」のような文字は「%2B」とか「%2F」にエスケープされます。なのでURLにプラスやスラッシュを含んだBase64の文字があると、URLエンコードした時にそれらの記号が意図せぬエスケープを起こしてしまう可能性があります。それを避けるためにはプラスやスラッシュをエスケープされない別の記号に置き換える必要がある。これをURLセーフと言います。基本的には「+」は「-」、「/」は「_」に置き換えられます。GamilのAPIなんかはこの処理を行なっているみたいです。

このURLセーフな状態の文字を文字化けしないようにデコードするには、ハイフンやアンダーバーを元のプラスやスラッシュに戻してからデコードする必要がある。

$text = 'Base64の文字列';
$text = str_replace(array('-', '_'), array('+', '/'), $text);//-と_を+と/に置換
$text = base64_decode($text);//デコード

str_replace()の代わりにstrtr()を使っても良いです。

$text = 'Base64の文字列';
$text = strtr($text, '-_', '+/');//-と_を+と/に置換
$text = base64_decode($text);//デコード

URLセーフが問題なのであれば、このやり方で文字化けは解消します。

逆にいうと、URLセーフなエンコードをしたい時には+と/を-と_に置換してやれば良いってことですね。

$text = '任意の文字列';
$text = base64_encode($text);//エンコード
$text = str_replace(array('+', '/'), array('-', '_'), $text);//+と/を-と_に置換

置換してからエンコードじゃなくてエンコードしてから置換です。



そういや全然関係ないけど、どーにかしたいっていうジャニーズの世界を描いた漫画あったよね。20年くらい前の漫画だけど、結構面白かったよ。TOKIOの松岡くんがマボさんって呼ばれてるのはその漫画読んで初めて知りました。あまりそう呼んでる人を見たことがない気もするけど、ジャッキーチェンが呼んでるところは見た。

僕も今よりも顔とスタイルと性格が良くてダンスが踊れてトークが上手くて歌も歌えてバラエティ番組で体を張ることができて演技力もあってイケメンでかっこよくてイケメンでイケメンだったら、万に一つくらいの可能性でジャニーズに入れる可能性が万に一つくらいはあったのかもしれないのになあ。来世に期待するか。
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください