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获取mysql版本的几种方法小结
Mar 25 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
php获取目标函数执行时间示例
Mar 04 PHP
php读取csv文件并输出的方法
Mar 14 PHP
PHP aes (ecb)解密后乱码问题
Jun 22 PHP
php阿拉伯数字转中文人民币大写
Dec 21 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 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
example1.php
2006/10/09 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
JavaScipt基本教程之JavaScript语言的基础
2008/01/16 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
require.js的用法详解
2015/10/20 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python得到单词模式的示例
2018/10/15 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
英国床垫在线:Mattress Online
2016/12/07 全球购物
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
实习自荐信
2013/10/13 职场文书
社区工作者思想汇报
2014/01/13 职场文书
医学生个人求职信范文
2014/02/07 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
班班通项目实施方案
2014/02/25 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
自主招生推荐信范文
2014/05/10 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
Django框架之路由用法
2022/06/10 Python