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 相关文章推荐
十天学会php之第二天
Oct 09 PHP
我的论坛源代码(三)
Oct 09 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
Wordpress 相册插件 NextGEN-Gallery 添加目录将中文转为拼音的解决办法
Dec 29 PHP
深入PHP FTP类的详解
Jun 13 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
PHP笛卡尔积实现算法示例
Jul 30 PHP
PHP implode()函数用法讲解
Mar 08 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
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
JQuery开发的数独游戏代码
2010/10/29 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
Angular 4.x 路由快速入门学习
2017/05/03 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Python3几个常见问题的处理方法
2019/02/26 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
python实现可变变量名方法详解
2019/07/01 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
利用python 读写csv文件
2020/09/10 Python
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
社团招新策划书
2014/02/04 职场文书
思品教学工作总结
2015/08/10 职场文书
护理心得体会范文
2016/01/22 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
Elasticsearch 聚合查询和排序
2022/04/19 Python