【PHP】Base64とBase64 URLの相互変換(エンコード・デコード)
2022-9-29 | PHP
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君も仲間に入れてあげて欲しい。