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下清空字符串中的HTML标签的代码
Sep 06 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
浅谈PHP中的
Apr 23 PHP
php简单压缩css样式示例
Sep 22 PHP
PHP内存缓存功能memcached示例
Oct 19 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
Dec 23 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
laravel按天、按小时,查询数据的实例
Oct 09 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 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最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
jquery text()要注意啦
2009/10/30 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
探究JavaScript中的五种事件处理程序方式
2016/12/07 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python单例模式实例详解
2017/03/01 Python
python取代netcat过程分析
2018/02/10 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python tornado微信开发入门代码
2018/08/24 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
解决Python使用列表副本的问题
2019/12/19 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
瑞典耳机品牌:URBANISTA
2019/12/03 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
应届医学毕业生求职信分享
2013/12/02 职场文书
装饰资料员岗位职责
2013/12/30 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
科技馆观后感
2015/06/08 职场文书
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang