为什么base64_encode()添加了一个斜线“/";结果


Why is base64_encode() adding a slash "/" in the result?

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

$url = 'subjects?_d=1';
echo base64_encode($url);
// Outputs
c3ViamVjdHM/X2Q9MQ==

请注意"X2"前面的斜线。

为什么会发生这种情况?我以为base64只输出A-Z、0-9和'='作为填充?

否。Base64字母表包括A-Z、A-Z、0-9以及+/

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

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

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

以下示例将标准base64转换为RFC4648:中指定的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));
}

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

对不起,你想错了。A-Za-z0-9只能为您提供62个字符。Base64使用了另外两个字符,在PHP的例子中是/+

这并没有什么特别之处。

以64为底的"字母表"或"数字"是A-Z、A-Z、0-9加上两个额外的字符+(加号)和/(斜线)。

如果您愿意,以后可以使用%2f对/进行编码。

对于base64,有效字符集为:EFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz0123456789+/

=用作最后一个字节的填充符

M。

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

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

A-Z是26个字符。0-9是10个字符。=是一个字符。这总共提供了37个字符,比64个字符少了一些。

/是64个字符中的一个。你可以在维基百科页面上看到一个完整的列表。