2008年10月20日 星期一

PHP 與 Javascript URL 編碼函數

PHP URL Function:
urlencode()
urldecode()

rawurledcode()
$a = '!@#$%^&*()_+|-=\{}[]:;"\',./<>?`~';
echo $b= rawurlencode($a);
結果:
%21%40%23%24%25%5E%26%2A%28%29_%2B%7C-%3D%5C%7B%7D%5B%5D%3A%3B%22%27%2C.%2F%3C%3E%3F%60%7E

看來只有 . - _ 這三個符號不會被轉換



javascript URL Function:
encodeURI()
decodeURI()

很多情況下, 我們需要將資料傳送到別的網頁, 都需要先將資料編碼後送出。由於使用者輸入的資料千奇百怪, 如果沒有編碼, 很可能在接收頁面就出現錯誤。尤其在現在的網站幾乎都大量運用 Ajax, 使用 Ajax 來傳值幾乎是家常便飯。所以這三個 javascript 的 method 就一定要知道如何運用及使用時機了。

一般情況下, 最好選擇 encodeURIComponent()。

以下就簡單說一下差異點:
方法一: escape()
不編碼的符號包括: @*/+
escape 不編碼 + (加號), 將使表單欄位資料中有空白的處理(用 + 連結字串)造成問題。且 escape 在處理非 ASCII 語系的字元會有問題。所以, 除非特例, 應儘量避免使用 escape()。
方法二: encodeURI()
不編碼符號包括: ~!@#$&*()=:/,;?+'
用 encodeURI() 會比使用 escape() 轉換 URI 正確。比較要注意的是這個方法不處理 ' (單引號)。
方法三: encodeURIComponent()
不編碼符號包括: ~!*()'
encodeURIComponent() 是適合大部分單一 URI 的編碼方法。這個方法通常可以正確的編出正確的編碼, 例如要編碼一段有 flash 的 html(參數有 & 符號), 如果用其他的方法, 大概解碼後 flash 也不能看了。比較要注意的是這個方法也不處理 ' (單引號)。

奇怪, 我總是一開始都用了最不合適的方法。最早的時候我開始處理 encoding 我就用 escape(), 不過 escape 在 utf-8 的網頁中, 很容易就會出錯。後來就改用 encodeURI(), 沒有想到就又遇到要傳有 & 符號...終於, 最後用了 encodeURIComponent()。不過, 從錯誤中也可以學習到很多的東西。


把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。
不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '

php 與 javascript是可以互相傳遞的~

escape() 方法:
javascript escape() 與php 轉換的方法

採用ISO Latin字符集對指定的字符串進行編碼。所有的空格符、標點符號、特殊字符以及其他非ASCII字符都將被轉化成%xx格式的字符編碼(xx等於該字符在字符集表裡面的編碼的16進制數字)。比如,空格符對應的編碼是%20。
不會被此方法編碼的字符: @ * / +

另外還有: 

encodeURI() 方法:

把URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。
不會被此方法編碼的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent() 方法:

把 URI字符串採用UTF-8編碼格式轉化成escape格式的字符串。與encodeURI()相比,這個方法將對更多的字符進行編碼,比如 / 等字符。所以如果字符串裡面包含了URI的幾個部分的話,不能用這個方法來進行編碼,否則 / 字符被編碼之後URL將顯示錯誤。
不會被此方法編碼的字符:! * ( ) '
因此,對於中文字符串來說,如果不希望把字符串編碼格式轉化成UTF-8格式的(比如原頁面和目標頁面的charset是一致的時候),只需要使用 escape。如果你的頁面是GB2312或者其他的編碼,而接受參數的頁面是UTF-8編碼的,就要採用encodeURI或者 encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之後引進的,escape則在javascript1.0版本就有。
這邊可以參考

php 用來 decode encodeURIComponent() 的 function
function utf8Urldecode(&$value) {
if (is_array($value)) {
foreach ($value as $key => $val) {
$value[$key] = utf8Urldecode($val);
}
} else {
$value = preg_replace('/%([0-9a-f]{2})/ie', 'chr(hexdec("$1"))', (string)$value);
}
}

use :
utf8Urldecode(&$_POST['value'])

這邊還有解釋:

js對文字進行編碼涉及3個函數:escape,encodeURI,encodeURIComponent,相應3個解碼函數:unescape,decodeURI,decodeURIComponent

1、 傳遞參數時需要使用encodeURIComponent,這樣組合的url才不會被#等特殊字符截斷。

例如:

2、 進行url跳轉時可以整體使用encodeURI

例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");

3、 js使用數據時可以使用escape
[Huoho.Com編輯]

例如:搜藏中history紀錄。

4、 escape對0-255以外的unicode值進行編碼時輸出%u****格式,其它情況下escape,encodeURI,encodeURIComponent編碼結果相同。


最多使用的應為encodeURIComponent,它是將中文、韓文等特殊字符轉換成utf-8格式的url編碼,所以如果給後台傳遞參數需要使用encodeURIComponent時需要後台解碼對utf-8支持(form中的編碼方式和當前頁面編碼方式相同)

escape不編碼字符有69個:*+-./@_ 0-9 a-z A-Z

encodeURI不編碼字符有82個:!#$&'()*+-./:;=?@_~ 0-9 a-z A-Z

encodeURIComponent不編碼字符有71個:! '( )*-._~ 0-9 a-z A-Z

【下列文章您可能也有興趣】

沒有留言: