PHP中文URL编解码(urlencode()rawurlencode()


Posted in PHP onJuly 03, 2010

下面是详细解释:///\\\
string urlencode ( string str)
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页: 例子 1. urlencode() 示例

<?php 
echo '<a href="mycgi?foo=', urlencode($userinput), '">'; 
?>

注意:小心与 HTML 实体相匹配的变量。像 &、© 和 £ 都将被浏览器解析,并使用实际实体替代所期待的变量名。这是明显的混乱,W3C 已经告诫人们好几年了。参考地址:http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2 PHP 通过 arg_separator .ini 指令,支持将参数分割符变成 W3C 所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用 & 代替 & 作为分隔符。你不需要为此修改 PHP 的 arg_separator。让它仍为 &,而仅使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。
例子 2. urlencode() 与 htmlentities() 示例
<?php 
echo '<a href="mycgi?foo=', htmlentities(urlencode($userinput)), '">'; 
?>

string urlencode ( string str)
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。例如,如果你想在 FTP 的 URL 中包含密码:
例子 1. rawurlencode() 示例 1

<?php 
echo '<a href="ftp://user:', rawurlencode('foo @+%/'), 
'@ftp.my.com/x.txt">'; 
?>

或者,如果你想通过 URL 的 PATH_INFO 构成部分去传递信息:
例子 2. rawurlencode() 示例 2

<?php 
echo '<a href="http://x.com/department_list_script/', 
rawurlencode('sales and marketing/Miami'), '">'; 
?>

在解码时,可以使用相应的 urldecode() 和 rawurldecode(),相应地,rawurldecode() 不会把加号('+')解码为空格,而 urldecode() 可以。 下面是详细示例:
string urldecode ( string str)
解码给出的已编码字符串中的任何 %##。返回解码后的字符串。 例子 1. urldecode() example

<?php 
$a = explode('&', $QUERY_STRING); 
$i = 0; 
while ($i < count($a)) { 
$b = split('=', $a[$i]); 
echo 'Value for parameter ', htmlspecialchars(urldecode($b[0])), 
' is ', htmlspecialchars(urldecode($b[1])), "<br />n"; 
$i++; 
} 
?>

string rawurldecode ( string str)
返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。
例子 1. rawurldecode() 示例
<?php 
echo rawurldecode('foo%20bar%40baz'); // foo bar@baz 
?>

但是,有一点需要注意的地方是,urldecode() 和 rawurldecode() 解码出的字符串是 UTF-8格式的编码,如果URL中含有中文的话,而页面设置又不是 UTF-8 的话,则要把解码出的字符串进行转换,才能正常显示!
还有一个问题,就是所获得的 URL 不是 %%nn n={0..F} 的格式,而是 %unnnn n={0..F} 的格式,这时候再使用 urldecode() 和 rawurldecode() 是无法正确解码的,而要用下面这个函数才能正确解码:
function utf8RawUrlDecode ($source) 
{ 
$decodedStr = ""; 
$pos = 0; 
$len = strlen ($source); 
while ($pos < $len) { 
$charAt = substr ($source, $pos, 1); 
if ($charAt == '%') { 
$pos++; 
$charAt = substr ($source, $pos, 1); 
if ($charAt == 'u') { 
// we got a unicode character 
$pos++; 
$unicodeHexVal = substr ($source, $pos, 4); 
$unicode = hexdec ($unicodeHexVal); 
$entity = "&#". $unicode . ';'; 
$decodedStr .= utf8_encode ($entity); 
$pos += 4; 
} 
else { 
// we have an escaped ascii character 
$hexVal = substr ($source, $pos, 2); 
$decodedStr .= chr (hexdec ($hexVal)); 
$pos += 2; 
} 
} else { 
$decodedStr .= $charAt; 
$pos++; 
} 
} 
return $decodedStr; 
}
PHP 相关文章推荐
15个小时----从修改程序到自己些程序
Oct 09 PHP
介绍几个array库的新函数 php
Dec 29 PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 PHP
php 保留字列表
Oct 04 PHP
非常实用的php弹出错误警告函数扩展性强
Jan 17 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
最新最全PHP生成制作验证码代码详解(推荐)
Jun 12 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
浅谈PHP中的面向对象OOP中的魔术方法
Jun 12 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
Laravel中9个不经常用的小技巧汇总
Apr 16 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php的一些小问题
Jul 03 #PHP
php HtmlReplace输入过滤安全函数
Jul 03 #PHP
php下mysql数据库操作类(改自discuz)
Jul 03 #PHP
php下通过伪造http头破解防盗链的代码
Jul 03 #PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 #PHP
php防盗链的常用方法小结
Jul 02 #PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 #PHP
You might like
PHP备份/还原MySQL数据库的代码
2011/01/06 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
JavaScript实现移动端滑动选择日期功能
2016/06/21 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
2018/04/23 jQuery
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
vue element自定义表单验证请求后端接口验证
2019/12/11 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
Python聚类算法之DBSACN实例分析
2015/11/20 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
tornado+celery的简单使用详解
2019/12/21 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
全球性的在线购物网站:Zapals
2017/03/22 全球购物
java程序员面试交流
2012/11/29 面试题
幼师求职信
2014/06/23 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
护士2014年终工作总结
2014/11/11 职场文书
租车协议书
2015/01/27 职场文书
我的1919观后感
2015/06/03 职场文书
三八红旗手先进事迹材料(2016推荐版)
2016/02/25 职场文书
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python