Joe*_*ynn 264
还有其他base64规范.(详见此处的表格).但基本上你需要65个字符来编码:26小写+ 26大写+ 10位= 62.
你还需要两个['+','/']和一个填充字符'='.但是它们都不是网友友好的,所以只要为它们使用不同的字符就可以了.上图中的标准值是[' - ','_'],但只要您对它们进行解码,就可以使用其他字符,而不需要与其他字符共享.
我建议你自己写一个帮手.喜欢这些来自base64_encode的php手册页上的评论:
function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '._-');
}
function base64_url_decode($input) {
return base64_decode(strtr($input, '._-', '+/='));
}
Run Code Online (Sandbox Code Playgroud)
Thi*_*raj 195
不,您需要对其进行url编码,因为base64字符串可以包含"+","="和"/"字符,这些字符可能会改变数据的含义 - 看起来像子文件夹.
有效的base64字符如下.
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
Run Code Online (Sandbox Code Playgroud)
rod*_*ira 72
@joeshmo或者你可以只编写base64编码的字符串来代替编写辅助函数.这将与您的辅助函数完全相同,但不需要两个额外的函数.
$str = 'Some String';
$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );
Run Code Online (Sandbox Code Playgroud)
小智 38
介绍性说明我倾向于发表一些澄清,因为这里的一些答案有点误导(如果不是不正确的话).
答案是否定的,您不能简单地在URL查询字符串中传递base64编码参数,因为加号会转换为$ _GET全局数组中的SPACE.换句话说,如果你发送的test.php?myVar的= stringwith +符号来
//test.php
print $_GET['myVar'];
Run Code Online (Sandbox Code Playgroud)
结果将是:
stringwith sign
解决这个问题的简单方法是在urlencode()将base64字符串添加到查询字符串之前将其简单地转义为将+,=和/字符转义为%##代码.例如,urlencode("stringwith+sign")退货stringwith%2Bsign
处理操作时,PHP会在填充$ _GET全局时自动解码查询字符串.例如,如果我给test.php的?myVar的= stringwith%2Bsign到
//test.php
print $_GET['myVar'];
Run Code Online (Sandbox Code Playgroud)
结果是:
stringwith+sign
您不希望urldecode()返回的$ _GET字符串,因为+将被转换为空格.
换句话说,如果我发出同样的test.php?myVar的= stringwith%2Bsign到
//test.php
$string = urldecode($_GET['myVar']);
print $string;
Run Code Online (Sandbox Code Playgroud)
结果出乎意料:
stringwith sign
rawurldecode()输入是安全的,然而,这将是多余的,因此是不必要的.
Mic*_*rny 13
是的,不是.
在某些情况下,base64的基本字符集可能会与URL中使用的传统约定冲突.但是许多base64实现允许你更改charset以更好地匹配URL,甚至可以随附一个(如Python urlsafe_b64encode()).
您可能面临的另一个问题是URL长度的限制或更确切地说 - 缺少此类限制.由于标准没有指定任何最大长度,因此使用HTTP协议的浏览器,服务器,库和其他软件可能会定义其自身的限制.您可以看一下这篇文章:WWW常见问题解答:URL的最大长度是多少?
它是一个base64url编码,你可以尝试,它只是上面的joeshmo代码的扩展.
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
Run Code Online (Sandbox Code Playgroud)