close

最近遇到要使用PHP把參數加到URL中,遇到特殊字元要轉碼

一開始直覺使用urlencode(),結果它把空白轉成"+"號....

後來仔細一查發現要使用rawurlencode()才行

--

查了一下發現2011年有碰到類似問題

[轉] 混亂的 URLEncode

--

以下為轉文 https://blog.longwin.com.tw/2015/11/php-rawurlencode-urlencode-diff-2015/

 

PHP 的 urlencode() 官方說明

 

  • 返回字元串,此字元串中除了 -_. 之外的所有非字母數字字元都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼為加號(+)。
  • 此編碼與 WWW 表單 POST 數據的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。
  • 由於歷史原因,此編碼在將空格編碼為加號(+)方面與 » RFC3986 編碼(參見 rawurlencode())不同。

 

PHP 的 rawurlencode() 官方說明

 

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

 

上述說明還是很難懂,這邊做個比較簡單的說明:

 

  • UrlEncode 的定義,RFC 3986 有定義一個標準,但是 HTTP 也定義另外一個標準,但是兩個標準基本上是一致的,但是在某些保留字上有些出入。
  • 其中最明顯的案例就是「空白字元」

RFC 3986 與 HTTP 定義的空白字元差異

結論

 

除了 PHP 的以外,也把其它程式語言一起列出來。

PHP

 

  • urlencode 是走 HTTP (RFC 1866):空白字元用「+」
  • rawurlencode 是走 RFC 3986:空白字元用「%20」

 

JavaScript

 

  • encodeURI、encodeURIComponent:空白字元用「%20」,要做 application/x-www-form-urlencoded (AJAX POST)的話,要自己把 「%20」 換成 「+」

 

Python 2

 

  • urllib.urlencode:空白字元用「+」

 

Python 3

 

  • urllib.parse.urlencode:空白字元用「%20」

相關網頁

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 dizzy03 的頭像
    dizzy03

    碎碎念

    dizzy03 發表在 痞客邦 留言(0) 人氣()