为什么base64_encode()在结果中添加斜杠"/"?

Bad*_*sie 39 php base64 encoding

我正在编码我的应用程序的URL后缀:

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

// Outputs
c3ViamVjdHM/X2Q9MQ==
Run Code Online (Sandbox Code Playgroud)

注意'X2'之前的斜杠.

为什么会这样?我认为base64只输出AZ,0-9和'='作为填充?我已经尝试使用在线base64编码器来检查,似乎base64总是这样做.我不知道它是下划线"_"还是问号"?" 还是"="或许?

Art*_*ct2 82

不可以.Base64字母包括AZ,az,0-9 +/.

如果您不关心其他应用程序的可移植性,则可以替换它们.

请参阅:http://en.wikipedia.org/wiki/Base64#Variants_summary_table

您可以使用类似的东西来代替使用您自己的符号(替换-_您想要的任何东西,只要它不在base64基本字母表中,当然!).

以下示例将普通base64转换为RFC6448 中指定的 base64url :

function base64url_encode($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}

function base64url_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}
Run Code Online (Sandbox Code Playgroud)

  • @SpencerGrantDoak RFC 4648*为base64url指定了一个不同的字母表,可以通过替换字符来创建:`+`变成`-`,`/`变成`_`.这比URL编码更有效,URL编码可能会对某些输入(很多位设置为1)扩展很多结果. (2认同)

Sno*_*kle 12

除了上面的所有答案,指出/是预期的base64字母表的一部分,应该注意你在编码字符串中看到/的特殊原因,是因为当base64编码ASCII文本时,唯一的方法是生成一个/是在一个可被三整除的位置上的问号.

  • `~` 也会产生一个 `+`。不确定是否还有其他人。 (2认同)

dec*_*eze 6

对不起,你错了.A-Za-z0-9只能获得62个字符.在64的情况下/,Base64使用两个额外的字符+.


Igo*_*bin 5

这并没有什么特别的。

64 基“字母”或“数字”是 AZ、az、0-9 加上两个额外字符 +(加号)和 /(斜杠)。

如果需要,您可以稍后使用 %2f 对 / 进行编码。


pou*_*sma 5

对于 Base64,有效的字符集为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

= 用作最后字节的填充符

M。


tfo*_*ont 5

没有直接关系,上面有足够多的人已经很好地回答和解释了解决方案。

然而,有点超出了事情的范围。如果您想要可读的基本文本,请尝试查看Base58。如果您只需要字母数字字符,那么值得考虑。