php urlencode()與urldecode()函數(shù)字符編碼原理詳解
更新時(shí)間:2011年12月06日 01:05:25 作者:
中文字符編碼研究系列第五期,詳解 urlencode()與urldecode()函數(shù)字符編碼原理,兩個(gè)函數(shù)分別用于編碼 URL 字符串和解碼已編碼的 URL 字符串,實(shí)現(xiàn)對(duì)中文字符的編碼
其原理就是把中文字符轉(zhuǎn)換為十六進(jìn)制并按某種規(guī)則進(jìn)行字符串組合,實(shí)現(xiàn)字符的編碼與解編碼,保證URL數(shù)據(jù)傳遞過(guò)程中字符的完整性和兼容性,主要討論中文字符的編碼情況。
一,F(xiàn)ireFox瀏覽器編碼中文字符
在Firefox瀏覽器下如果輸入中文字符,將會(huì)自動(dòng)實(shí)現(xiàn)URL編碼,如下
按下Enter鍵前

按下Enter鍵后

二,urlencode()函數(shù)原理
urlencode()函數(shù)用于編碼URL字符串,這里主要討論中文字符的編碼情況,
實(shí)例如下
echo urlencode('不要迷戀哥');//輸出:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7
urlencode()函數(shù)原理就是首先把中文字符轉(zhuǎn)換為十六進(jìn)制,然后在每個(gè)字符前面加一個(gè)標(biāo)識(shí)符%,了解了這個(gè)原理,可以實(shí)現(xiàn)自定義的URL編碼函數(shù),代碼如下
$string = "不要迷戀哥";
$length = strlen($string);
echo $string;
$result = array();
//十進(jìn)制
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
//十六進(jìn)制
$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = "%".dechex($dec[0])." "."%".dechex($dec[1]);
}
var_dump($strings);
然后對(duì)輸出的結(jié)果與直接使用urlencode()編碼的字符進(jìn)行比較,如上:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7
通過(guò)上面實(shí)例可知,使用urlencode()函數(shù)編碼中文字符實(shí)質(zhì)上就是把字符轉(zhuǎn)換為十六進(jìn)制再在第個(gè)字符左邊加上一個(gè)特殊的標(biāo)識(shí)符%
三,urldecode()函數(shù)原理
使用urldecode()函數(shù)解碼已編碼的 URL 字符串,實(shí)例如下
echo urldecode('%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7');//輸出:不要迷戀哥
urldecode()函數(shù)與urlencode()函數(shù)原理相反,用于解碼已編碼的 URL 字符串,其原理就是把十六進(jìn)制字符串轉(zhuǎn)換為中文字符,結(jié)合上面實(shí)例,同樣可實(shí)現(xiàn)自定義函數(shù)解碼字符串
$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]));
}
上面實(shí)例代碼首先按字符串的規(guī)則取出各個(gè)字符的十六進(jìn)制,然后使用hexdec()函數(shù)把十六進(jìn)制轉(zhuǎn)換為十進(jìn)制,然后再使用chr()函數(shù)把十進(jìn)制轉(zhuǎn)換為字符,實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為字符。輸出結(jié)果如下
urlencode
(PHP 3, PHP 4, PHP 5)
urlencode -- 編碼 URL 字符串
說(shuō)明
string urlencode ( string str )
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(hào)(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類(lèi)型編碼方式一樣。由于歷史原因,此編碼在將空格編碼為加號(hào)(+)方面與 RFC1738 編碼(參見(jiàn) rawurlencode())不同。此函數(shù)便于將字符串編碼并將其用于 URL 的請(qǐng)求部分,同時(shí)它還便于將變量傳遞給下一頁(yè)
urldecode
(PHP 3, PHP 4, PHP 5)
urldecode -- 解碼已編碼的 URL 字符串
說(shuō)明
string urldecode ( string str )
解碼給出的已編碼字符串中的任何 %##。返回解碼后的字符串。
五,參考資源
urlencode()說(shuō)明
urldecode()說(shuō)明
一,F(xiàn)ireFox瀏覽器編碼中文字符
在Firefox瀏覽器下如果輸入中文字符,將會(huì)自動(dòng)實(shí)現(xiàn)URL編碼,如下
按下Enter鍵前

按下Enter鍵后

二,urlencode()函數(shù)原理
urlencode()函數(shù)用于編碼URL字符串,這里主要討論中文字符的編碼情況,
實(shí)例如下
復(fù)制代碼 代碼如下:
echo urlencode('不要迷戀哥');//輸出:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7
urlencode()函數(shù)原理就是首先把中文字符轉(zhuǎn)換為十六進(jìn)制,然后在每個(gè)字符前面加一個(gè)標(biāo)識(shí)符%,了解了這個(gè)原理,可以實(shí)現(xiàn)自定義的URL編碼函數(shù),代碼如下
復(fù)制代碼 代碼如下:
$string = "不要迷戀哥";
$length = strlen($string);
echo $string;
$result = array();
//十進(jìn)制
for($i=0;$i<$length;$i++){
if(ord($string[$i])>127){
$result[] = ord($string[$i]).' '.ord($string[++$i]);
}
}
var_dump($result);
//十六進(jìn)制
$strings = array();
foreach($result as $v){
$dec = explode(" ",$v);
$strings[] = "%".dechex($dec[0])." "."%".dechex($dec[1]);
}
var_dump($strings);
然后對(duì)輸出的結(jié)果與直接使用urlencode()編碼的字符進(jìn)行比較,如上:%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7
通過(guò)上面實(shí)例可知,使用urlencode()函數(shù)編碼中文字符實(shí)質(zhì)上就是把字符轉(zhuǎn)換為十六進(jìn)制再在第個(gè)字符左邊加上一個(gè)特殊的標(biāo)識(shí)符%
三,urldecode()函數(shù)原理
使用urldecode()函數(shù)解碼已編碼的 URL 字符串,實(shí)例如下
echo urldecode('%B2%BB%D2%AA%C3%D4%C1%B5%B8%E7');//輸出:不要迷戀哥
urldecode()函數(shù)與urlencode()函數(shù)原理相反,用于解碼已編碼的 URL 字符串,其原理就是把十六進(jìn)制字符串轉(zhuǎn)換為中文字符,結(jié)合上面實(shí)例,同樣可實(shí)現(xiàn)自定義函數(shù)解碼字符串
復(fù)制代碼 代碼如下:
$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]));
}
上面實(shí)例代碼首先按字符串的規(guī)則取出各個(gè)字符的十六進(jìn)制,然后使用hexdec()函數(shù)把十六進(jìn)制轉(zhuǎn)換為十進(jìn)制,然后再使用chr()函數(shù)把十進(jìn)制轉(zhuǎn)換為字符,實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為字符。輸出結(jié)果如下
urlencode
(PHP 3, PHP 4, PHP 5)
urlencode -- 編碼 URL 字符串
說(shuō)明
string urlencode ( string str )
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(hào)(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類(lèi)型編碼方式一樣。由于歷史原因,此編碼在將空格編碼為加號(hào)(+)方面與 RFC1738 編碼(參見(jiàn) rawurlencode())不同。此函數(shù)便于將字符串編碼并將其用于 URL 的請(qǐng)求部分,同時(shí)它還便于將變量傳遞給下一頁(yè)
urldecode
(PHP 3, PHP 4, PHP 5)
urldecode -- 解碼已編碼的 URL 字符串
說(shuō)明
string urldecode ( string str )
解碼給出的已編碼字符串中的任何 %##。返回解碼后的字符串。
五,參考資源
urlencode()說(shuō)明
urldecode()說(shuō)明
相關(guān)文章
PHP中空字符串介紹0、null、empty和false之間的關(guān)系
用PHP開(kāi)發(fā)那么久,PHP中空字符串、0、null、empty和false之間的關(guān)系總是有些不確定的東西。遇到它們應(yīng)該用哪個(gè)方法函數(shù)去處理2012-09-09php多次include后導(dǎo)致全局變量global失效的解決方法
這篇文章主要介紹了php多次include后導(dǎo)致全局變量global失效的解決方法,實(shí)例分析了$GLOBALS失效的原理與解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02linux平臺(tái)編譯安裝PHP7并安裝Redis擴(kuò)展與Swoole擴(kuò)展實(shí)例教程
這篇文章主要介紹了linux平臺(tái)編譯安裝PHP7并安裝Redis擴(kuò)展與Swoole擴(kuò)展的方法,結(jié)合實(shí)例形式詳細(xì)分析了Linux平臺(tái)上安裝php7并安裝Redis擴(kuò)展與Swoole擴(kuò)展的具體步驟與操作技巧,需要的朋友可以參考下2016-09-09js限制checkbox勾選的個(gè)數(shù)以及php獲取多個(gè)checkbbox的方法深入解析
以下是對(duì)js限制checkbox勾選的個(gè)數(shù)以及php獲取多個(gè)checkbbox的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07php flush無(wú)效,IIS7下php實(shí)時(shí)輸出的方法
這篇文章主要介紹了php flush無(wú)效,IIS7下php實(shí)時(shí)輸出的方法,需要的朋友可以參考下2016-08-08php下刪除一篇文章生成的多個(gè)靜態(tài)頁(yè)面
php自定義函數(shù)之刪除一篇文章生成的多個(gè)靜態(tài)頁(yè)面,可能有多頁(yè)的文章,都是需要考慮到的。2010-08-08