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


Posted in PHP onDecember 06, 2011

其原理就是把中文字符转换为十六进制并按某种规则进行字符串组合,实现字符的编码与解编码,保证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()说明

PHP 相关文章推荐
加强版phplib的DB类
Mar 31 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
php 团购折扣计算公式
Nov 24 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
php删除数组元素示例分享
Feb 17 PHP
php中in_array函数用法分析
Nov 15 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
php使用for语句输出三角形的方法
Jun 09 PHP
php中get_magic_quotes_gpc()函数说明
Feb 06 PHP
PHP7多线程搭建教程
Apr 21 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
laravel 解决后端无法获取到前端Post过来的值问题
Oct 22 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 #PHP
PHP性能优化工具篇Benchmark类调试执行时间
Dec 06 #PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 #PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 #PHP
php的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 #PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 #PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
Dec 05 #PHP
You might like
PHP的面试题集,附我的答案和分析(一)
2006/11/19 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
微信支付开发交易通知实例
2016/07/12 PHP
php cli模式下获取参数的方法
2017/05/05 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
JavaScript访问样式表代码
2010/10/15 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
2017/03/04 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
Python循环语句之break与continue的用法
2015/10/14 Python
python正则分析nginx的访问日志
2017/01/17 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
2014新年元旦活动策划方案
2014/02/18 职场文书
自行车广告词大全
2014/03/21 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
中国合伙人观后感
2015/06/02 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS