php urlencode()与urldecode()函数字符编码原理详解

2015-01-24信息快讯网

中文字符编码研究系列第五期,详解 urlencode()与urldecode()函数字符编码原理,两个函数分别用于编码 URL 字符串和解码已编码的 URL 字符串,实现对中文字符的编码

其原理就是把中文字符转换为十六进制并按某种规则进行字符串组合,实现字符的编码与解编码,保证URL数据传递过程中字符的完整性和兼容性,主要讨论中文字符的编码情况。

一,FireFox浏览器编码中文字符

在Firefox浏览器下如果输入中文字符,将会自动实现URL编码,如下

按下Enter键前
php urlencode()与urldecode()函数字符编码原理详解_信息快讯网
按下Enter键后
php urlencode()与urldecode()函数字符编码原理详解_信息快讯网

二,urlencode()函数原理

urlencode()函数用于编码URL字符串,这里主要讨论中文字符的编码情况,

实例如下
 
echo urlencode('不要迷恋哥');//输出:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7 

urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%,了解了这个原理,可以实现自定义的URL编码函数,代码如下
 
$string = "不要迷恋哥"; 
$length = strlen($string); 
echo $string; 
$result = array(); 
//十进制 
for($i=0;$i<$length;$i++){ 
if(ord($string[$i])>127){ 
$result[] = ord($string[$i]).' '.ord($string[++$i]); 
} 
} 
var_dump($result); 
//十六进制 
$strings = array(); 
foreach($result as $v){ 
$dec = explode(" ",$v); 
$strings[] = "%".dechex($dec[0])." "."%".dechex($dec[1]); 
} 
var_dump($strings); 

php urlencode()与urldecode()函数字符编码原理详解_信息快讯网

上面代码在[PHP实现中文字符进制转换原理分析]一文中中文字符转十六进制原理分析部分有详细讨论,通过获取汉字的各个字符再转换为十六进制,同时在每个字符前面加上一个特殊的标识符%,就实现了urlencode()函数的功能,输出结果如下
然后对输出的结果与直接使用urlencode()编码的字符进行比较,如上:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7

通过上面实例可知,使用urlencode()函数编码中文字符实质上就是把字符转换为十六进制再在第个字符左边加上一个特殊的标识符%

三,urldecode()函数原理

使用urldecode()函数解码已编码的 URL 字符串,实例如下

echo urldecode('%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7');//输出:不要迷恋哥
urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原理就是把十六进制字符串转换为中文字符,结合上面实例,同样可实现自定义函数解码字符串
 
$string = '%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7'; 
$length = strlen($string); 
$hexs = array(); 
for($i=0;$i<$length;$i++){ 
if($string[$i] == '%'){ 
$hexs[] = $string[++$i].$string[++$i]; 
} 
} 
$num = count($hexs); 
for($i=0;$i<$num;$i++){ 
echo chr(hexdec($hexs[$i])).chr(hexdec($hexs[++$i])); 
} 

上面实例代码首先按字符串的规则取出各个字符的十六进制,然后使用hexdec()函数把十六进制转换为十进制,然后再使用chr()函数把十进制转换为字符,实现十六进制转换为字符。输出结果如下

php urlencode()与urldecode()函数字符编码原理详解_信息快讯网

四,urldecode()与urlencode()函数说明

urlencode
(PHP 3, PHP 4, PHP 5)
urlencode -- 编码 URL 字符串
说明
string urlencode ( string str )
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页

urldecode
(PHP 3, PHP 4, PHP 5)
urldecode -- 解码已编码的 URL 字符串
说明
string urldecode ( string str )
解码给出的已编码字符串中的任何 %##。返回解码后的字符串。

五,参考资源
urlencode()说明
urldecode()说明
CURL的学习和应用(附多线程实现)
基于session_unset与session_destroy的区别详解
基于PHP CURL获取邮箱地址的详解
解析CI即CodeIgniter框架在Nginx下的重写规则
php curl的深入解析
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
解析dedecms空间迁移步骤详解
基于curl数据采集之正则处理函数get_matches的使用
基于curl数据采集之单页面并行采集函数get_htmls的使用
PHP字符串的编码问题的详细介绍
str_replace只替换一次字符串的方法
PHP 数组和字符串互相转换实现方法
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
PHP中文件缓存转内存缓存的方法
PHP中实现中文字符进制转换原理分析
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
php的chr和ord函数实现字符加减乘除运算实现代码
PHP详解ASCII码对照表与字符转换
php从右向左/从左向右截取字符串的实现方法
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
一个PHP的QRcode类与大家分享
PHP学习散记_编码(json_encode 中文不显示)
php空间不支持socket但支持curl时recaptcha的用法
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
让Json更懂中文(JSON_UNESCAPED_UNICODE)
PHP 小心urldecode引发的SQL注入漏洞
PHP判断远程url是否有效的几种方法小结
php下利用curl判断远程文件是否存在的实现代码
©2014-2024 dbsqp.com