首頁  >  文章  >  後端開發  >  php中文url轉碼的實作方法

php中文url轉碼的實作方法

藏色散人
藏色散人原創
2020-07-21 10:52:403555瀏覽

在php中可以使用urlencode函數或rawurlencode函數對URL進行轉碼,其語法分別是「urlencode ( string str)」和「rawurldecode ( string str)」。

php中文url轉碼的實作方法

php中文url轉碼

  PHP中對於URL進行編碼,可以使用urlencode() 或rawurlencode(),二者的區別是前者把空格編碼為' ',而後者把空格編碼為' ',不過應該注意的是,在編碼時應該只對部分URL編碼,否則URL中的冒號和反斜線也會被轉義。

下面是詳細解釋:

string urlencode ( string str)

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

推薦:《PHP教程

範例1. urlencode() 範例

<?php
echo &#39;<a href="mycgi?foo=&#39;, urlencode($userinput), &#39;">&#39;;
?>

注意:小心與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 &#39;<a href="mycgi?foo=&#39;, htmlentities(urlencode($userinput)), &#39;">&#39;;
?>

string urlencode ( string str)

#回傳字串,此字串中除了-_. 之外的所有非字母數字字元都將被替換成百分號(%)後跟兩位十六進制數。這是在 RFC 1738 中描述的編碼,是為了保護原義字元以免其被解釋為特殊的 URL 定界符,同時保護 URL 格式以免其被傳輸媒體(像一些郵件系統)使用字元轉換時弄亂。例如,如果你想在FTP 的URL 中包含密碼:

範例1. rawurlencode() 範例1

<?php
echo &#39;<a href="ftp://user:&#39;, rawurlencode(&#39;foo @+%/&#39;),
   &#39;@ftp.my.com/x.txt">&#39;;
?>

或者,如果你想透過URL 的PATH_INFO 構成部分去傳遞訊息:

範例2. rawurlencode() 範例2

<?php
echo &#39;<a href="http://x.com/department_list_script/&#39;,
   rawurlencode(&#39;sales and marketing/Miami&#39;), &#39;">&#39;;
?>

 

## 

        解碼時,可以使用對應的urldecode() 和rawurldecode(),相應地,rawurldecode() 不會把加號(' ')解碼為空格,而urldecode() 可以。以下是詳細範例:

string urldecode ( string str)

解碼給出的已編碼字串中的任何 %##。傳回解碼後的字串。

範例1. urldecode() example

<?php
$a = explode(&#39;&&#39;, $QUERY_STRING);
$i = 0;
while ($i < count($a)) {
   $b = split(&#39;=&#39;, $a[$i]);
   echo &#39;Value for parameter &#39;, htmlspecialchars(urldecode($b[0])),
   &#39; is &#39;, htmlspecialchars(urldecode($b[1])), "<br />\n";
   $i++;
}
?>

 

string rawurldecode ( string str)

傳回字串,此字符串中百分號(%)後面跟著兩位十六進位數的序列都會被替換成原義字元。

範例1. rawurldecode() 範例

<?php
echo rawurldecode(&#39;foo%20bar%40baz&#39;); // 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 == &#39;%&#39;) {
            $pos++;
            $charAt = substr ($source, $pos, 1);
            if ($charAt == &#39;u&#39;) {
                // we got a unicode character
                $pos++;
                $unicodeHexVal = substr ($source, $pos, 4);
                $unicode = hexdec ($unicodeHexVal);
                $entity = "&#". $unicode . &#39;;&#39;;
                $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中文url轉碼的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn