官方说:
urlencode是一个函数,可将字符串以URL编码,用于编码处理。
URL编码(URL encoding),也称作百分号编码(Percent-encoding), 是特定上下文的统一资源定位符 (URL)的编码机制。
适用于统一资源标识符(URI)的编码,也用于为"application/x-www-form-urlencoded" MIME准备数据, 因为它用于通过HTTP的请求操作(request)提交HTML表单数据。
那么具体是如下实现的呢?自己做一个,就印象最深刻了。
$str='//我们_是 个孩子+-*/'; echo rawurlencode($str); echo chr(13).chr(10); echo jhcencode($str); function jhcencode($str){ $jg=''; mb_internal_encoding('utf8'); $len=mb_strlen($str); for($i=0;$i<$len;$i++){ $c=mb_substr($str,$i,1); if($c==' '){ $jg.='+'; }elseif(preg_match('/[0-9a-zA-Z-_.]/',$c)){ $jg.=$c; }else{ $jg.='%'.trim(chunk_split(strtoupper(bin2hex($c)),2,'%'),'%'); } } return $jg; }
可见,字母数字和三个大神(-_.)不用变,空格变加号(+),其他的做十六进制处理。
而rawurlencode,只是取消了空格的特权,规则为:字母数字和三个大神(-_.)不用变,其他的做十六进制处理。
所以呢,空格就变成%20,而不是+号了。可以这样实现:
function rawjhcencode($str){ $jg=''; mb_internal_encoding('utf8'); $len=mb_strlen($str); for($i=0;$i<$len;$i++){ $c=mb_substr($str,$i,1); if(preg_match('/[0-9a-zA-Z-_.]/',$c)){ $jg.=$c; }else{ $jg.='%'.trim(chunk_split(strtoupper(bin2hex($c)),2,'%'),'%'); } } return $jg; }
raw是什么意思呢?就是未经处理的,生的。就算是生肉把。