前段時間說本身遇到了個《URL加號引起錯誤》的BUG,引發這個bug的緣由就是本身在URL中使用了 urlencode 函數,該函數會把空格轉換成加號,這樣就致使URL解析出錯,而空格只有轉換成 %20 才能夠能夠正常解析,這時咱們就須要使用 rawurlencode 函數。下面就介紹一下 urlencode 函數與 rawurlencode 函數的區別:php
urlencode 函數:安全
返回字符串,此字符串中除了 -_. 以外的全部非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼爲加號(+)。此編碼與 WWW 表單 POST 數據的編碼方式是同樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式同樣。因爲歷史緣由,此編碼在將空格編碼爲加號(+)方面與 RFC1738 編碼(參見 rawurlencode())不一樣。服務器
rawurlencode 函數:app
返回字符串,此字符串中除了 -_. 以外的全部非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數。這是在 » RFC 3986 中描述的編碼,是爲了保護原義字符以避免其被解釋爲特殊的 URL 定界符,同時保護 URL 格式以避免其被傳輸媒體(像一些郵件系統)使用字符轉換時弄亂。下面咱們來看一下例子:函數
代碼以下 | 複製代碼 |
<?php編碼 $string = "hello world";url echo urlencode($string) . '<br/>'; //輸出:hello+world ?>.net |
具體例子比較:code
代碼以下 | 複製代碼 |
<?php $asscii = pack("H*",$str); exit; 輸出結果: |
---------------------------------------------------------------------------------
比較兩者的結果:
1. 數字、大小寫字母都不編碼
2. 減號、點號、下劃線 三個不編碼
3. rawurlencode比urlencode多編碼一個」加號「
關於JavaScript中escape與encodeURIComponent的區別:
代碼以下 | 複製代碼 |
>>> console.log(encodeURIComponent("統一註冊1")); %E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1 <?php 輸出結果: |
結果說明:
1. encodeURIComponent 老是把輸入轉換成utf8編碼處理的,按字節編碼
2. escape是按照unicode編碼處理的,由於它也對url中不安全的字符作了編碼,因此也能夠在url中作編碼使用,可是,服務器端不會自動解碼,下面提供一個PHP版的解碼函數,是用手冊裏找的:
<?php
代碼以下 | 複製代碼 |
function unescape($str) { ?>
>>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~")); *+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz |
結果比較:
escape未編碼的字符: *+-./@_ 共7個
encodeURIComponent未編碼的字符: !’()*-._~ 共9個