1. 程式人生 > >urlencode()與urldecode()函式字元編碼原理詳解

urlencode()與urldecode()函式字元編碼原理詳解

其原理就是把中文字元轉換為十六進位制並按某種規則進行字串組合,實現字元的編碼與解編碼,保證URL資料傳遞過程中字元的完整性和相容性,主要討論中文字元的編碼情況。

一,FireFox瀏覽器編碼中文字元

在Firefox瀏覽器下如果輸入中文字元,將會自動實現URL編碼,如下

按下Enter鍵前
php-internet-url-encode-before
按下Enter鍵後
php-internet-url-encode

二,urlencode()函式原理

urlencode()函式用於編碼URL字串,這裡主要討論中文字元的編碼情況,

例項如下
複製程式碼 程式碼如下:
echo urlencode('不要迷戀哥');//輸出:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7

urlencode()函式原理就是首先把中文字元轉換為十六進位制,然後在每個字元前面加一個識別符號%,瞭解了這個原理,可以實現自定義的URL編碼函式,程式碼如下
複製程式碼
程式碼如下:
$string = "不要迷戀哥";
$length = strlen($string);
echo $string;
$result = array();
//十進位制
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
//十六進位制
$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = "%".dechex($dec[0])." "."%".dechex($dec[1]);
}
var_dump($strings);

php-self-urlencode

上面程式碼在[PHP實現中文字元進位制轉換原理分析]一文中中文字元轉十六進位制原理分析部分有詳細討論,通過獲取漢字的各個字元再轉換為十六進位制,同時在每個字元前面加上一個特殊的識別符號%,就實現了urlencode()函式的功能,輸出結果如下
然後對輸出的結果與直接使用urlencode()編碼的字元進行比較,如上:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7

通過上面例項可知,使用urlencode()函式編碼中文字元實質上就是把字元轉換為十六進位制再在第個字元左邊加上一個特殊的識別符號%

三,urldecode()函式原理

使用urldecode()函式解碼已編碼的 URL 字串,例項如下

echo urldecode('%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7');//輸出:不要迷戀哥
urldecode()函式與urlencode()函式原理相反,用於解碼已編碼的 URL 字串,其原理就是把十六進位制字串轉換為中文字元,結合上面例項,同樣可實現自定義函式解碼字串
複製程式碼
程式碼如下:
$string = '%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7';
$length = strlen($string);
$hexs = array();
for($i=0;$i<$length;$i++){
if($string[$i] == '%'){
$hexs[] = $string[++$i].$string[++$i];
}
}
$num = count($hexs);
for($i=0;$i<$num;$i++){
echo chr(hexdec($hexs[$i])).chr(hexdec($hexs[++$i]));
}

上面例項程式碼首先按字串的規則取出各個字元的十六進位制,然後使用hexdec()函式把十六進位制轉換為十進位制,然後再使用chr()函式把十進位制轉換為字元,實現十六進位制轉換為字元。輸出結果如下

php-self-urldecode

四,urldecode()與urlencode()函式說明

urlencode

(PHP 3, PHP 4, PHP 5)
urlencode -- 編碼 URL 字串
說明
string urlencode ( string str )
返回字串,此字串中除了 -_. 之外的所有非字母數字字元都將被替換成百分號(%)後跟兩位十六進位制數,空格則編碼為加號(+)。此編碼與 WWW 表單 POST 資料的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體型別編碼方式一樣。由於歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼(參見 rawurlencode())不同。此函式便於將字串編碼並將其用於 URL 的請求部分,同時它還便於將變數傳遞給下一頁

urldecode
(PHP 3, PHP 4, PHP 5)
urldecode -- 解碼已編碼的 URL 字串
說明
string urldecode ( string str )
解碼給出的已編碼字串中的任何 %##。返回解碼後的字串。

五,參考資源
urlencode()說明
urldecode()說明