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 相关文章推荐
PHP制作图型计数器的例子
Oct 09 PHP
php巧获服务器端信息
Dec 06 PHP
PHP array_multisort()函数的使用札记
Jul 03 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
Aug 11 PHP
PHP 透明水印生成代码
Aug 27 PHP
php中curl和file_get_content的区别
May 10 PHP
php输出全球各个时区列表的方法
Mar 31 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
PHP实现对数组分页处理实例详解
Feb 07 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 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 is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
微信小程序 flex实现导航实例详解
2017/04/26 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
python将list转为matrix的方法
2018/12/12 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python WebSocket长连接心跳与短连接的示例
2020/11/24 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
合作投资意向书
2014/04/01 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
放射科岗位职责
2015/02/14 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android