【PHP】base64encode、decodeの仕組み、使い方を解説

PHP

base64とは

base64というのは、簡単に説明すると「日本語、画像、動画ファイルなどのマルチバイト文字やバイナリデータを様々な機器でやり取りできるようにする」ためのものです。

もう少し正しい言い方をすると「マルチバイト文字(日本語等)やバイナリデータ(画像データ等)をA-Z a-z 0-9 と+と/の二つの記号だけの文字で表したもの」で、英数字しか扱えないような場合に日本語を保存したりする場合に用いられます。

また、この変換を行うと、データ量が元の約33%大きくなります。

実際に以下のサイトで試してみると、変換後は少しデータ量が増えていることが分かります。

PHPでの変換方法

文字列→base64

通常の文字列をPHPでbase64に変換(エンコード)する関数はこちらです。

  • base64_encode( 文字列 )

「文字列」の場所に文字列を直接または変数を入れることでエンコードされた値が返されます。

サンプル:

$text="base64エンコードするテキスト";
//base64エンコード
$encode=base64_encode($text);
//エンコード結果を出力
echo $encode;

結果はこのようになります。

[ YmFzZTY044Ko44Oz44Kz44O844OJ44GZ44KL44OG44Kt44K544OI ]

このように、すべての文字がエンコードされているのが分かります。

では、この文字列を元に戻すにはどうすればいいのでしょうか。

base64→元の文字列

base64エンコードした文字列を元に戻すには、別の関数を利用します。

それは、

  • base64_decode( 文字列 )

です。この関数を使用することでbase64に変換された文字列を元の文字列に変換(デコード)することができます。サンプルコードはこちらです。

$text="YmFzZTY044Ko44Oz44Kz44O844OJ44GZ44KL44OG44Kt44K544OI";
$decode=base64_decode($text);
//デコード結果を出力
echo $decode;

結果はこのようになります。

[ base64エンコードするテキスト ]

base64へ変換する主な利用パターン

PHPのbase64encode、decodeは、主に次のような時に利用します。

  • 日本語、バイナリデータを破損しないように転送したい場合
  • 日本語やバイナリデータの保存に対応していない場合

また、これ以外にもPHP以外など様々な場面でも利用するため、覚えておきましょう。

ですが、次の点を忘れないようにしましょう。

base64の注意点

base64encodeなどを利用していて、覚えておきたいことがいくつかありますので、簡単に紹介していきます。

base64には「記号」が含まれる

base64encodeは、記号(+と/)が含まれます。なので、URLにbase64したデータで直接送信すると、サーバー側やブラウザ側が誤認識してしまい、正常に動作しない場合があります。記号のみを別の値に変換するなど、別の対応が必要です。(URLではURLエンコードを使用しましょう。)

base64encodeをすることでデータ量が増加する

再度言いますが、base64エンコードはするたびにデータが約33%増加します。

例えば、9文字(半角)の文字列をエンコードすると約12文字になります。つまり3文字増えたことになります。そしてその12文字をさらにエンコードすると何文字になるのでしょうか。

単純に考えると3文字ずつ増えていくのかな?なんて思ってしまいますが、実行するたびに文字列が増えるので、3文字増える→4文字増えるのように、どんどん膨れ上がってしまうのです。

つまり、12文字をエンコードすると、15文字ではなく、16文字になるのです。

そのため、PHPの処理ができなくなり、メモリー浪費でエラーになってしまうことがあります。

ちなみにですが、これは単体で暗号化として絶対に使ってはいけません。先ほど述べたように、パスワードがないため誰でも簡単に元の文字に戻すことができる為です。

暗号化したデータをbase64encodeする使い方が一般的です。

最後に

base64は、メリットもデメリットも半々にあります。適切に使うことで、思わぬバグも防ぐことにつながったりするので、是非使ってみてください。