ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

Android→PHP Base64encodeの値を渡す

諸事情でandroidからintentを使って標準ブラウザを起動して、GETパラメタにBase64エンコードした値を
サーバ側(PHP)で受け取って、Base64でデコードしなきゃいけなかったのですが、出来なかったのでメモ。

結論から言うと

  • PHP側の問題
    • GETなりPOSTなりでBase64エンコードされたパラメタを取得した場合、「+」が勝手にスペースに変換される
  • android側の問題
    • android2.2以降で使える標準のBase64.encodeToStringのオプションの値が適切でなかった

というわけで以下の対策をする

  • android
    • android.util.Base64.NO_WRAP
      • 改行が取り除かれるのでURL上で変なことにならなくなる
    • android.util.Base64.URL_SAFE
      • URL上で安全に使えるよう「+」→「-」「/」→「_」に変換される
  • PHP
    • GETなりPOSTなりの値をstr_replace(array('-', '_'), array('+', '/'), $str)みたいな感じで置換

これで正しくデコードされます。
めでたしめでたし。

追記
phpでデコード・エンコードする関数

<?php
    function androidBase64Decode($str)
    {   
        return base64_decode(str_replace(array('-', '_'), array('+', '/'), $str));
    }   

    function androidBase64Encode($str)
    {   
        return str_replace(array('+', '/'), array('-', '_'), base64_encode($str));
    }