Php 为什么base64_encode()要添加斜杠/&引用;结果如何?

Php 为什么base64_encode()要添加斜杠/&引用;结果如何?,php,encoding,base64,Php,Encoding,Base64,我正在对我的应用程序的URL后缀进行编码: $url = 'subjects?_d=1'; echo base64_encode($url); // Outputs c3ViamVjdHM/X2Q9MQ== 注意“X2”前面的斜杠 为什么会这样?我以为base64只输出A-Z、0-9和“=”作为填充?我曾尝试使用在线base64编码器进行检查,base64似乎总是这样做。我不知道是下划线“u”还是问号“?”还是“=”也许?否。Base64字母表包括A-Z、A-Z、0-9和+和/ 如果您不关心

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

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

// Outputs
c3ViamVjdHM/X2Q9MQ==
注意“X2”前面的斜杠


为什么会这样?我以为base64只输出A-Z、0-9和“=”作为填充?我曾尝试使用在线base64编码器进行检查,base64似乎总是这样做。我不知道是下划线“u”还是问号“?”还是“=”也许?

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

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

见:

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

以下示例将普通base64转换为base64url:


对不起,你想错了。A-Za-z0-9只给你62个字符。Base64使用了两个额外的字符,在PHP的例子中,A-Z是26个字符。 0-9是10个字符。 =是一个字符。总共有37个字符,比64个短了一点


/
是64个字符之一。您可以在上看到完整的列表。

这没有什么特别之处

基本的64个“字母”或“数字”是A-Z、A-Z、0-9加上两个额外字符+(加号)和/(斜线)


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

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

=用作最后字节的填充符


M.

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

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

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

希望它能帮助您

public function generate_key($s) {
    return str_replace(array('+', '/'), array('-', '_'), base64_encode($s));
}
$randomKey = generate_key(openssl_random_pseudo_bytes(12)); //you can change this number for different length of keys in base64 format
您可以通过下面的功能解码上述键。只需将加密字符串传递到这里

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

不需要解码openssl_random_pseudo_bytes(),但您可以将其用于其他情况,如解码url…

Base64转换。出于兴趣,您为什么不希望使用
/
?因为我正在编码一个用作url参数的字符串,“/”会破坏应用程序,因为它认为它是另一个参数的开始。@BadHorsie-用于对URL的字符串进行编码,而不是
base64\u encode
。是的,斜杠是哑的。差不多什么都可以。谢谢。我的应用程序总是基于PHP的,所以我替换它们有关系吗?只要你在应用程序中解码之前做相反的转换,不。使用不同于URL安全编码的方案不是一个好主意,这是一个老问题,但我支持@owlstead的评论。只需在base64字符串上使用
urldecode()
urlencode()
。如果这样做,您就偏离了标准。@SpencerGrantDak RFC 4648确实为base64url指定了一个不同的字母表,只需替换字符即可创建:
+
变成
-
/
变成
\ucode>。这比URL编码更有效,URL编码可能会对某些输入(许多位设置为1)的结果进行大量扩展。也不要忘记a-z,这会使您有63个字符:)@PaulBain-我没有,问题是:)那么
+
呢?当且仅当
发生在可被3整除的位置时,
~
也将产生
+
。不确定是否还有其他人。
function key_decode($s) {
    return base64_decode(str_replace(array('-', '_'), array('+', '/'), $s));
}