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 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
可定制的PHP缩略图生成程式(需要GD库支持)
Mar 06 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
php模块memcache和memcached区别分析
Jun 14 PHP
20个PHP常用类库小结
Sep 11 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 PHP
PHP 字符串长度判断效率更高的方法
Mar 02 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
php解析字符串里所有URL地址的方法
Apr 03 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
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php实现Mysql简易操作类
2015/10/11 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
小程序实现层叠卡片滑动效果
2019/08/26 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
python通过yield实现数组全排列的方法
2015/03/18 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
python如何实现内容写在图片上
2018/03/23 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Python任务自动化工具tox使用教程
2020/03/17 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
python 进程池pool使用详解
2020/10/15 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
读群众路线心得体会
2014/03/07 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
解除劳动合同协议书
2014/09/17 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
微信小程序实现拍照和相册选取图片
2021/05/09 Javascript
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python