URI 請求地址中編碼中關於空格轉換%20還是+的問題、表單提交
阿新 • • 發佈:2021-10-26
由來
W3C標準規定,當Content-Type為application/x-www-form-urlencoded時,URL中查詢引數名和引數值中空格要用加號+替代,所以幾乎所有使用該規範的瀏覽器在表單提交後,URL查詢引數中空格都會被編成加號+。而在另一份規範(RFC 2396,定義URI)裡, URI裡的保留字元都需轉義成%HH格式(Section 3.4 Query Component),因此空格會被編碼成%20,加號+本身也作為保留字而被編成%2B,對於某些遵循RFC 2396標準的應用來說,它可能不接受查詢字串中出現加號+,認為它是非法字元。所以一個安全的舉措是URL中統一使用%20來編碼空格字元。
js中的編碼和反編碼
escape(string) 解碼 unescape()
encodeURI:對整個的url進行編碼時使用。 解碼 decodeURI()
encodeURIComponent:對某個url中的引數進行編碼。 解碼 decodeURIComponent()
php中
urlencode() 解碼urldecode()
rawurlencode() 解碼 rawurldecode()
escape和unescape的php版本
escape
/** * js escape php 實現 * @param $string the string want to be escaped * @param $in_encoding * @param $out_encoding */ function escape($string, $in_encoding = 'UTF-8',$out_encoding = 'UCS-2') { $return = ''; if (function_exists('mb_get_info')) { for($x = 0; $x < mb_strlen ( $string, $in_encoding ); $x ++) { $str = mb_substr ( $string, $x, 1, $in_encoding ); if (strlen ( $str ) > 1) { // 多位元組字元 $return .= '%u' . strtoupper ( bin2hex ( mb_convert_encoding ( $str, $out_encoding, $in_encoding ) ) ); } else { $return .= '%' . strtoupper ( bin2hex ( $str ) ); } } } return $return; }
unescape
function unescape($str) { $ret = ''; $len = strlen($str); for ($i = 0; $i < $len; $i ++) { if ($str[$i] == '%' && $str[$i + 1] == 'u') { $val = hexdec(substr($str, $i + 2, 4)); if ($val < 0x7f) $ret .= chr($val); else if ($val < 0x800) $ret .= chr(0xc0 | ($val >> 6)) . chr(0x80 | ($val & 0x3f)); else $ret .= chr(0xe0 | ($val >> 12)) . chr(0x80 | (($val >> 6) & 0x3f)) . chr(0x80 | ($val & 0x3f)); $i += 5; } else if ($str[$i] == '%') { $ret .= urldecode(substr($str, $i, 3)); $i += 2; } else $ret .= $str[$i]; } return $ret; }