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 MySQL应用中使用XOR运算加密算法分享
Aug 28 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
Jun 21 PHP
PHP生成不同颜色、不同大小的tag标签函数
Sep 23 PHP
php中的PHP_EOL换行符详细解析
Oct 26 PHP
用PHP代码在网页上生成图片
Jul 01 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
PHP线程的内存回收问题
Jul 08 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
详解cookie验证的php应用的一种SSO解决办法
Oct 20 PHP
PHP fclose函数用法总结
Feb 15 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/10/09 PHP
php防注
2007/01/15 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
php验证码实现代码(3种)
2015/09/07 PHP
php实现中文转数字
2016/02/18 PHP
PHP错误机制知识汇总
2016/03/24 PHP
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
JavaScript动态加载样式表的方法
2015/03/21 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
node 文件上传接口的转发的实现
2019/09/23 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python使用configparser库读取配置文件
2020/02/22 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
python中取绝对值简单方法总结
2020/07/24 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
大学毕业生推荐信
2014/07/09 职场文书
道士塔读书笔记
2015/06/30 职场文书
工作简报范文
2015/07/21 职场文书