【PHP】Base64とBase64 URLの相互変換(エンコード・デコード)

ネコニウム研究所

PCを利用したモノづくりに関連する情報を掲載するブログ

【PHP】Base64とBase64 URLの相互変換(エンコード・デコード)

2022-9-29 |

PHPでBase64とBase64 URLを相互変換(エンコード・デコード)したい!

.NET/C#の記事は下記に掲載してます。

概要

この記事では、PHPでBase64とBase64 URLを相互変換(エンコード・デコード)する手順を掲載する。

Base64は、バイナリなどのデータを64種類の文字列で表現するエンコード方式です。

Base64 URLは、Base64から更にURLとして使える文字列で表現するエンコード方式です。具体的にはBase64にエンコードした文字列に下記の処理を行う。

  • +-に置換する
  • /_に置換する
  • 末尾の=を削除する

仕様書

環境

  • PHP 8.0.17

手順書

下記は、文字列をBase64にエンコードした後にBase64 URLにエンコードした文字列を返す関数です。

<?php
function base64url_encode($v)
{
    $v = base64_encode($v);
    $v = preg_replace("/[=]+$/", "", $v);
    return str_replace(array('+', '/'), array('-', '_'), $v);
}
?>

下記は、Base64 URLにエンコードされた文字列をBase64にデコードした後に元の文字列にデコードした文字列を返す関数です。

<?php
function base64url_decode($v)
{
    $v = str_replace(array('-', '_'), array('+', '/'), $v);

    for ($i = 0; $i < strlen($v) % 4; $i++) {
        $v .= "=";
    }

    return base64_decode($v);
}
?>

Base64は、文字列の長さを4の倍数にする必要がある。下記のコードの部分で文字列の長さが4の倍数になってるか判定して4の倍数になってなければ、文字列の末尾に=を挿入して文字列の長さを調整してる。

<?php
    for ($i = 0; $i < strlen($v) % 4; $i++) {
        $v .= "=";
    }
?>

まとめ(感想文)

BASE64はいろんな環境でライブラリとかで標準でサポートされてるんだけども、BASE64URL君も仲間に入れてあげて欲しい。