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面向对象概念
Nov 06 PHP
PHP 读取Postgresql中的数组
Apr 14 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
PHP实现搜索相似图片
Sep 22 PHP
php验证码的制作思路和实现方法
Nov 12 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
PHP获取不了React Native Fecth参数的解决办法
Aug 26 PHP
php加密解密字符串示例
Oct 13 PHP
PHP面向对象自动加载机制原理与用法分析
Oct 14 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 PHP
php的单例模式及应用场景详解
Feb 27 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程序员应该了解MongoDB的五件事
2013/06/03 PHP
浅谈php冒泡排序
2014/12/30 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
Laravel框架FormRequest中重写错误处理的方法
2019/02/18 PHP
javascript JSON操作入门实例
2010/04/16 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
基于vue2实现左滑删除功能
2017/11/28 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
layui 实现自动选择radio单选框(checked)的方法
2019/09/03 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
基于Python中random.sample()的替代方案
2020/05/23 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
大学自主招生自荐信范文
2014/02/26 职场文书
淘宝店策划方案
2014/06/07 职场文书
公司周年庆活动方案
2014/08/25 职场文书
处级干部考察材料
2014/12/24 职场文书
Nginx配置Https安全认证的实现
2021/05/26 Servers
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL