web-dev-qa-db-ja.com

base64_encode()が結果にスラッシュ「/」を追加するのはなぜですか?

アプリケーションのURLサフィックスをエンコードしています:

$url = 'subjects?_d=1';
echo base64_encode($url);

// Outputs
c3ViamVjdHM/X2Q9MQ==

「X2」の前のスラッシュに注意してください。

なぜこうなった? base64はA-Z、0-9、および「=」のみをパディングとして出力すると思いましたか?オンラインのbase64エンコーダを使用して確認しようとしましたが、base64は常にこれを行うようです。アンダースコア「_」なのか疑問符「?」なのかわかりません。または「=」

38
BadHorsie

いいえ。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));
}
80
Artefact2

上記のすべての回答に加えて、/は予想されるbase64アルファベットの一部であることを指摘し、エンコードされた文字列で/を見つけた特定の理由、 base64ASCIIテキストをエンコードするとき、/を生成する唯一の方法は、3で割り切れる位置に疑問符を付けることだからです。

11
Snorbuckle

申し訳ありませんが、あなたは間違っていると思いました。 A-Za-z0-9では、62文字しか取得できません。 Base64では、PHPの場合は/および+

6
deceze

それには特別なことは何もありません。

ベース64の「アルファベット」または「数字」は、A〜Z、a〜z、0〜9に2つの余分な文字+(プラス)および/(スラッシュ)を加えたものです。

必要に応じて、後で%2fで/をエンコードできます。

4
Igor Chubin

A-Zは26文字です。 0-9は10文字です。 =は1文字です。これにより、合計で37文字になりますが、64文字には少し足りません。

/は64文字の1つです。完全なリストは wikipediaページ で見ることができます。

3
Quentin

Base64の場合、有効な文字セットはABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /

=は最後のバイトのフィラーとして使用されます

M.

2
poussma

直接関係はありませんが、上記の十分な人々が解決策に非常によく答え、説明しています。

しかし、物事の範囲から少し外れます。読みやすいベーステキストが必要な場合は、Base58を調べてください。英数字のみを使用する場合は、検討する価値があります。

2
tfont