PHP rawurlencode与urlencode函数的深入分析

问题:2个函数都是针对字符串转义使其适合做文件名。该用哪个?哪个更标准?

结论:
rawurlencode遵守是94年国际标准备忘录RFC 1738,
urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20'
javascript的encodeURL也是94年标准,

而javascript的escape是另一种用"%xxx"标记unicode编码的方法。

推荐在PHP中使用用rawurlencode。弃用urlencode

样例
source:

超级无敌的人sadha sajdh数据样本sdls fhejrthcxzb.file.jpeg

PHP urlencode:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha+sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls+fhejrthcxzb.file.jpeg

PHP rawurlencode:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg

Javascript encodeURI:
%E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg

Javascript escape:
%u8D85%u7EA7%u65E0%u654C%u7684%u4EBAsadha%20sajdh%u6570%u636E%u6837%u672Csdls%20fhejrthcxzb.file.jpeg


详细出处参考:http://www.jb51.net/article/38181.htm

 

 

php rawurlencode和urlencode区别

rawurlencode 现在按 RFC 3986编码,php5.3.0之前遵守是94年国际标准备忘录 RFC 1738 。

urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20',此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与application/x-www-form-urlencoded的媒体类型编码方式一样。

javascript的encodeURL也是94年标准,而javascript的escape是另一种用"%xxx"标记unicode编码的方法,即符值大于 255 的字符以 %uxxxx 格式存储。

推荐在PHP中使用用rawurlencode。弃用urlencode 。

啥叫URL编码:除了-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数

RFC 3986增加为 除了-_.~ 四个字符  之外

-----------------------------------------------------------------------------------------

GET截断时用%00,那么COOKIE和POST怎么截断?

不是二进制改00,还是%00,因为GPC都是urlencode编码方式,

而multipart/form-data才是二进制编码,才需要改00

form设置了enctype="multipart/form-data"  属性后,就是2进制传输数据了

form里面的input的值传过去的不过是以2进制的方式,所以request就得不到值了。一般可以利用组件来读去input的值.

 

<think>好的,我现在需要帮助用户了解PHPurlencode函数的用法,并提供示例。首先,我要回忆一下这个函数的基本作用。根据引用资料,urlencode()主要用于对URL进行编码,特别是处理特殊字符,确保它们在URL中正确传输。比如,空格会被转换成加号+,其他非字母数字字符变成百分号加十六进制数,比如%20。 用户可能需要知道什么时候使用这个函数,比如在GET请求中传递参数时,或者处理表单数据。我需要解释清楚函数的基本语法:string urlencode(string $str),参数是待编码的字符串,返回值是编码后的字符串。 接下来,我应该举几个例子,比如编码一个带有空格和特殊字符的字符串,比如“PHP教程 & 示例”,编码后应该变成“PHP%E6%95%99%E7%A8%8B+%26+%E7%A4%BA%E4%BE%8B”。这里要注意中文字符会被编码成百分号形式,空格变加号,&符号也被编码。这符合引用3中的描述。 然后,用户可能需要知道如何在URL中使用编码后的参数。例如,构造一个带查询参数的URL,将参数值用urlencode处理,确保整个URL有效。比如,编码“search term”为“search+term”,然后拼接到URL中。 还要提到和rawurlencode的区别,根据引用3,rawurlencode会把空格转为%20,而urlencode转为+。这点需要强调,因为用户可能会混淆这两个函数。例如,在处理URL路径部分时,可能需要用rawurlencode,而在查询参数中用urlencode,因为表单POST数据通常用+号。 另外,需要提醒用户常见的应用场景,比如处理表单数据、生成动态链接、API请求参数编码等。同时,注意事项,比如不要对整个URL编码,只对参数部分编码,避免重复编码导致问题。 可能用户还会遇到编码后参数解码的问题,这时候需要提到urldecode函数的使用,但根据问题描述,用户目前只问编码,所以这部分可以作为补充,但不需要详细展开。 最后,确保示例代码正确,语法无误,并且符合PHP的书写规范。比如,使用echo输出结果,变量命名清晰。同时,注意在示例中展示编码前后的对比,让用户更直观理解。 总结一下,回答的结构应该是:函数作用、语法、示例、rawurlencode的区别、应用场景、注意事项。这样用户能逐步了解如何使用urlencode,并在实际开发中正确应用。</think>### PHP urlencode() 函数用法详解 #### 1. 核心作用 `urlencode()` 用于将字符串编码为合法的 URL 格式,主要处理以下字符: - 空格 → `+` 号 - 非字母数字字符 → `%` 开头的十六进制编码(如 `/` → `%2F`) - 中文等特殊字符 → UTF-8 编码后再转换(如 `教程` → `%E6%95%99%E7%A8%8B`) #### 2. 基础语法 ```php string urlencode ( string $str ) ``` ```php $raw_str = "PHP教程 & 示例"; $encoded = urlencode($raw_str); echo $encoded; // 输出:PHP%E6%95%99%E7%A8%8B+%26+%E7%A4%BA%E4%BE%8B ``` #### 3. 典型应用场景 **(1) GET 请求参数编码** ```php $query = urlencode("search term"); $url = "https://example.com/search?q=".$query; // q=search+term ``` **(2) 表单数据处理** ```php $form_data = [ 'name' => '张三', 'comment' => 'This is a test & demo' ]; $encoded_str = http_build_query($form_data); // 自动调用urlencode ``` **(3) API 参数传递** ```php $api_params = [ 'app_key' => 'AB12-CD34', 'timestamp' => time() ]; $request_url = "https://api.example.com?".http_build_query($api_params); ``` #### 4. rawurlencode() 的差异 | 函数 | 空格处理 | RFC标准 | 适用场景 | |------|---------|--------|----------| | urlencode() | `+` | 表单数据标准 | 查询参数 | | rawurlencode() | `%20` | RFC 3986 | URL路径 | ```php $path_segment = rawurlencode("user files"); // user%20files $url = "/download/".$path_segment; ``` #### 5. 注意事项 1. **双重编码问题** ```php // 错误做法 $double_encoded = urlencode(urlencode("数据")); // %25E6%2595%25B0%25E6%258D%25AE // 正确做法 $correct_encoded = urlencode("数据"); // %E6%95%B0%E6%8D%AE ``` 2. **编码范围控制 ```php $partial_url = "https://example.com/".urlencode("路径/文件"); // 错误!斜杠被编码 $valid_url = "https://example.com/".rawurlencode("路径/文件"); // 保留斜杠 ``` 3. **解码对应关系** ```php $decoded = urldecode("PHP+%26+MySQL"); // 返回 "PHP & MySQL" ``` #### 6. 高级用法示例 **处理JSON参数** ```php $filters = [ 'category' => '电子设备', 'price_range' => '1000-2000' ]; $json_params = urlencode(json_encode($filters)); // 结果:%7B%22category%22%3A%22%E7%94%B5%E5%AD%90%E8%AE%BE%E5%A4%87%22%2C%22price_range%22%3A%221000-2000%22%7D ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值