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 時,只要考量兩點 :
- 資料的存取
- 瀏覽器的識別
但在現今,各家社群網站林立,你在處理 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來進行編碼轉換,
發表迴響