1.对接的一个 urlencode 规则是除了字符数字_三种,其他的全部转化为%后面跟两位的 16 进制数
2.urlencode 文档:字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+),不符合
3. 使用 rawurlencode(),-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。
问题就是:将使用 rawurlencode()后没有转义的-和.替换为转义的%2D 和%2E
$a = '中国 de www 人.min-guo';
$b = rawurlencode($a);
str_replace('.','%2E',$b);
str_replace('-','%2D',$b);
$b = strtoupper($b);
echo $b;
输出的结果并没有替换:%E4%B8%AD%E5%9B%BDDE%20WWW%E4%BA%BA.MIN-GUO
1
xqin 2017-07-25 10:15:54 +08:00
```
$b = str_replace('.','%2E',$b); $b = str_replace('-','%2D',$b); ``` str_replace 又不是原地替换, 所以你要把返回值再次赋值给 $b |
4
vainl1 2017-07-25 10:42:51 +08:00
`$b = str_replace(['.','-'], ['%2E','%2D'], $b);`
|
7
gouchaoer 2017-07-25 10:47:01 +08:00
你是要能在 url 中传的 encode 么?有专门的版本
|
8
mmnnyycc OP @gouchaoer 我看了下就 urlencode 和 rawurlencode,不过规则是除了数字字符下划线其他全部转义,rawurlencode 比较符合,但是差了两个-和.
|
9
surfire91 2017-07-25 15:13:33 +08:00
@mmnnyycc 只是要好看点么,还有个方法 string strtr ( string $str , array $replace_pairs )
其实更好奇你是什么需求,一般 urlencode/rawurlencode 都满足了 |
10
mmnnyycc OP @surfire91 写那么一大坨,估计没看完,urlencode/rawurlencode 不会转义.和-,对接的接口需要
|
12
surfire91 2017-07-25 15:24:54 +08:00
|
13
lianxiaoyi 2017-07-26 09:24:23 +08:00
所以遇到传中文或者网址啊等等等需要转码的东西。我都经过 base64_encode 打成一个字符串,然后再替换掉 base64 里的 = 字符,例如将 = 替换为 _a 等等 ,需要用的时候再反解析回来。。。。。。有时 TM 传着传着就混了
|
14
mmnnyycc OP @lianxiaoyi 这对接的文档就写着字母数字下划线以外全部转义,只能这么来了
|