紀錄工作經驗、相關知識,解決技術相關問題。

PHP

PHP URL 編碼 – 解決 url 編碼存取問題(decode, encode)

PHP url 編碼

ulr 會依據需求而定,自從中文 url 出現,編碼的轉換存取,就成為新手幾乎必踩的坑,這邊直接講解答,希望能有幫助。

編碼轉換

談編碼存取,自然能想到有編碼,就有解碼,PHP , JS …等等的這些程式語言,針對編碼幾乎都有兩個函數可以用,關鍵字也很直白,分別為:

  • decode : 解碼
  • encode : 編碼

PHP URL 編碼存取

小萌新手在第一次處裡 url 時,會在 google 查詢到 PHP 針對 url 的編碼存取也很直白,直接前面加上 url,變成 :

  • urldecode : PHP url 解碼
  • urlencode : PHP url 編碼

到這裡就可以用了? NO, 顯然不是,這就是許多新手剛碰 url 編碼處理時,最常犯的錯誤

PHP 再針對url 的編碼,分為兩類,下面用比較好理解的方式來說明,分別為【一般編碼/解碼】與【針對路徑的編碼/解碼

一般編碼/解碼

該方法使用於一般顯示,白話說,就是你只想把網址顯示出來

  • urldecode
  • urlencode

針對路徑的編碼/解碼

該方法使用於路徑(圖片路徑、網址…等路徑)

  • rawurldecode
  • rawurlencode

兩者的差別

我們直接來看兩者對於符號的處理 :

與常用符號

// 你的字串
$str = 'abc~! _';

echo urlencode($str)
// 輸出結果 : abc%7E%21+_


echo rawurlencode($str)
// 輸出結果 : abc~%21%20_

特殊符號

// 你的字串
$str = '@#$%^&';

echo urlencode($str)
// 輸出結果 : %40%23%24%25%5E%26


echo rawurlencode($str)
// 輸出結果 : %40%23%24%25%5E%26

運算符號 – 加減乘除

// 你的字串
$str = '+-*/';

echo urlencode($str)
// 輸出結果 : %2B-%2A%2F


echo rawurlencode($str)
// 輸出結果 : %2B-%2A%2F

誇號與分隔號

// 你的字串
$str = '()|\\"\'';

echo urlencode($str)
// 輸出結果 : %28%29%7C%5C%22%27


echo rawurlencode($str)
// 輸出結果 : %28%29%7C%5C%22%27

上面四個範例,可以看到大部分符號上都一樣,差別就在於最一開始的常用符號,但面臨中文網址時,最常遇到出問題的也是常用符號,細節的差別,將會導致你的url 被視為有意義而被截斷。

注意事項 – 解碼 urldecode, rawurldecode 使用區別

在古早時代,當你面對 url 時,只要考量兩點 :

  1. 資料的存取
  2. 瀏覽器的識別

但在現今,各家社群網站林立,你在處理 url 編碼,除了考量以上兩點外,你還必須對各家社群軟體、平台的分享機制有所了解。

這邊舉個最實際的例子,假設你有一個網址,如下:

https://ex.com/?a=1|2|4|88|999

當你處裡編碼時

<!-- 使用 urldecode 處理時 -->
https%3A%2F%2Fex.com%2F%3Fa%3D1%7C2%7C4%7C88%7C999

<!-- 使用 rawurldecode 處理時 -->
https%3A%2F%2Fex.com%2F%3Fa%3D1%7C2%7C4%7C88%7C999

到這邊沒有出問題,但當你把網址分享時

https://ex.com/?a=1|2|4|88|999

<!-- 分享到 FB -->
https://ex.com/?a=1|2|4|88|999

<!-- 分享到 LINE -->
https://ex.com/?a=1

當你分享到不同的社群平台 or 社交軟體時,你就會發現在LINE中,符號 | 是有意義的,所以當你的網址出現 |時,將被截斷成兩部分,前面是網址,後面是一般文字,有興趣的可以試試看。

結論

url 中文都翻譯叫路徑了….如果你要處理的是 url 的存取,請使用 rawurldecode、rawurlencode來進行編碼轉換,

發表迴響