54

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

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

// Outputs
c3ViamVjdHM/X2Q9MQ==

注意“X2”之前的斜线。

为什么会这样?我以为base64只输出AZ、0-9和'='作为填充?

4

7 回答 7

112

不会。Base64 字母表包括 AZ、az、0-9 和+and /

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

见:http ://en.wikipedia.org/wiki/Base64#Variants_summary_table

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

以下示例将普通的 base64 转换为 RFC 4648 中指定的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));
}
于 2012-07-12T10:11:36.437 回答
18

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

于 2016-04-29T15:00:14.887 回答
6

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

于 2012-07-12T10:11:44.170 回答
4

没有什么特别的。

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

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

于 2012-07-12T10:12:13.007 回答
4

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

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

于 2017-04-28T13:08:11.353 回答
2

AZ 是 26 个字符。0-9 是 10 个字符。= 是一个字符。总共有 37 个字符,比 64 个要少一些。

/是 64 个字符之一。您可以在 wikipedia 页面上查看完整列表。

于 2012-07-12T10:11:47.643 回答
2

对于 base64,有效的字符集是:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

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

M。

于 2012-07-12T10:12:38.463 回答