【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君も仲間に入れてあげて欲しい。