我正在对应用程序的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个字符中的一个。你可以在维基百科页面上看到一个完整的列表。