アプリケーションのURLサフィックスをエンコードしています:
$url = 'subjects?_d=1';
echo base64_encode($url);
// Outputs
c3ViamVjdHM/X2Q9MQ==
「X2」の前のスラッシュに注意してください。
なぜこうなった? base64はA-Z、0-9、および「=」のみをパディングとして出力すると思いましたか?オンラインのbase64エンコーダを使用して確認しようとしましたが、base64は常にこれを行うようです。アンダースコア「_」なのか疑問符「?」なのかわかりません。または「=」
いいえ。Base64アルファベットには、A〜Z、a〜z、0〜9、+
および/
。
他のアプリケーションへの移植性を気にしない場合は、それらを置き換えることができます。
参照: http://en.wikipedia.org/wiki/Base64#Variants_summary_table
これらのようなものを使用して、代わりに独自のシンボルを使用できます(-
および_
もちろん、base64のベースアルファベットに含まれていない限り、何でもできます!)。
次の例では、通常のbase64をbase64urlに変換します RFC 4648で指定されている :
function base64url_encode($s) {
return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}
function base64url_decode($s) {
return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}
上記のすべての回答に加えて、/
は予想されるbase64
アルファベットの一部であることを指摘し、エンコードされた文字列で/
を見つけた特定の理由、 base64
がASCII
テキストをエンコードするとき、/
を生成する唯一の方法は、3で割り切れる位置に疑問符を付けることだからです。
申し訳ありませんが、あなたは間違っていると思いました。 A-Za-z0-9では、62文字しか取得できません。 Base64では、PHPの場合は/
および+
。
それには特別なことは何もありません。
ベース64の「アルファベット」または「数字」は、A〜Z、a〜z、0〜9に2つの余分な文字+(プラス)および/(スラッシュ)を加えたものです。
必要に応じて、後で%2fで/をエンコードできます。
A-Zは26文字です。 0-9は10文字です。 =は1文字です。これにより、合計で37文字になりますが、64文字には少し足りません。
/
は64文字の1つです。完全なリストは wikipediaページ で見ることができます。
Base64の場合、有効な文字セットはABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /
=は最後のバイトのフィラーとして使用されます
M.
直接関係はありませんが、上記の十分な人々が解決策に非常によく答え、説明しています。
しかし、物事の範囲から少し外れます。読みやすいベーステキストが必要な場合は、Base58を調べてください。英数字のみを使用する場合は、検討する価値があります。