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 引用是个坏习惯
Mar 12 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
Jul 03 PHP
基于MySQL体系结构的分析
May 02 PHP
浅析php变量修饰符static的使用
Jun 28 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
php array_keys 返回数组的键名
Oct 25 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 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
《雄兵连》系列首部大电影《烈阳天道》:可能是因为期望值太高了
2020/08/18 国漫
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
PHP实现的json类实例
2015/07/28 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
2016/06/22 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
基于vue+canvas的excel-like组件实例详解
2017/11/28 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
Python魔术方法详解
2015/02/14 Python
Django中create和save方法的不同
2019/08/13 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
python实现电子词典
2020/03/03 Python
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
机械电子工程专业推荐信范文
2013/11/20 职场文书
毕业生的自我评价范文
2013/12/31 职场文书
工伤赔偿协议书
2014/04/15 职场文书
环境保护建议书
2014/08/26 职场文书
餐饮服务员岗位职责
2015/02/09 职场文书
小学生大队委竞选稿
2015/11/20 职场文书