Php 为什么base64_encode()要添加斜杠/&引用;结果如何?
我正在对我的应用程序的URL后缀进行编码: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 = '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));
}