php 에서 urlencode 와 rawurlencode 의 차 이 를 간단히 말 하 다

얼마 전에'URL 플러스 오류 발생'버그 를 만 났 다 고 했 는데 이 버그 를 일 으 킨 이 유 는 URL 에 urlencode 함 수 를 사 용 했 기 때 문 입 니 다.이 함 수 는 빈 칸 을 플러스 로 변환 합 니 다.그러면 URL 해석 에 오류 가 발생 합 니 다.빈 칸 은%20 으로 변환 해 야 정상적으로 해석 할 수 있 습 니 다.이때 우 리 는 rawurlencode 함 수 를 사용 해 야 합 니 다.
다음은 urlencode 함수 와 rawurlencode 함수 의 차 이 를 소개 합 니 다.
urlencode 함수:
문자열 을 되 돌려 줍 니 다.이 문자열 은- 을 제외 합 니 다.이외 의 모든 비 자모 숫자 문 자 는 백분율(%)로 바 뀌 고 두 자리 16 진수 로 바 뀌 며 빈 칸 은 플러스(+)로 인 코딩 됩 니 다.이 인 코딩 은 WWW 폼 POST 데이터 의 인 코딩 방식 과 같 으 며,application/x-ww-form-urlencoded 의 미디어 형식 인 코딩 방식 과 같 습 니 다.역사적 인 이유 로 이 인 코딩 은 빈 칸 을 플러스(+)로 인 코딩 하 는 데 RFC 1738 인 코딩(rawurlencode()참조)과 다 릅 니 다.
rawurlencode 함수:
문자열 을 되 돌려 줍 니 다.이 문자열 은- 을 제외 합 니 다.이외 의 모든 비 자모 숫자 문 자 는 백분율(%)로 바 뀌 고 두 자리 16 진수 로 바 뀝 니 다.이 는»RFC 3986 에서 기술 한 인 코딩 으로,특수 한 URL 의 경계 문자 로 해석 되 지 않도록 원래 의 문 자 를 보호 하 는 동시에 전송 매체(일부 메 일 시스템)에서 문자 변환 을 사용 할 때 흐 트 러 지지 않도록 URL 형식 을 보호 하기 위 한 것 이다.다음은 예 를 들 어 보 겠 습 니 다.

<?php

$string = "hello world";

echo urlencode($string) . '<br/>'; //  :hello+world
echo rawurldecode($string) . '<br/>';//  :hello%20world

?>
 
구체 적 인 예 비교:

<?php
for ($i = 0x20; $i < 0x7f; $i++) { 
$str .= dechex($i); 
}

$asscii = pack("H*",$str); 
echo "       asscii  :(    ~)n". $asscii."
"; echo "urlencode :
".urlencode($asscii); echo "
"; echo "urlencode https://www.jb51.net/ :
".preg_replace("/%.{2}/","",urlencode($asscii)); echo "
"; echo "rawurlencode :
".rawurlencode($asscii); echo "
"; echo "rawurlencode :
".preg_replace("/%.{2}/","",rawurlencode($asscii)); echo "
"; exit; ?> : ――――――――――――――――――――――――――― asscii :( ~) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~ urlencode : +%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E urlencode : +-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz rawurlencode : %20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E rawurlencode : -.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
두 사람의 결 과 를 비교 하 다.
1.  숫자,대소 문자 모두 인 코딩 하지 않 습 니 다.
2.  마이너스  세 개 부호화 안 함
3.rawurlencode 는 urlencode 보다'플러스'를 하나 더 인 코딩 합 니 다.
JavaScript 에서 escape 와 encodeURIComponent 의 차이 점:

>>> console.log(encodeURIComponent("    1"));

%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1
>>> console.log(escape("    1"));
%u7EDF%u4E00%u6CE8%u518C1

<?php
echo iconv("utf-8","gbk",urldecode("%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1")); 
echo "
"; echo urldecode("%u7EDF%u4E00%u6CE8%u518C1"); // unescape //echo iconv("utf-8","gbk",unescape("%u7EDF%u4E00%u6CE8%u518C1"); exit; ?> : ====================================== 1 %u7EDF%u4E00%u6CE8%u518C1 ======================================
결과 설명:
1.encodeURIComponent 는 항상 입력 을 utf 8 인 코딩 으로 변환 하고 바이트 로 인 코딩 합 니 다.
2.escape 는 유 니 버 설 인 코딩 에 따라 처 리 됩 니 다.url 에 안전 하지 않 은 문자 도 인 코딩 했 기 때문에 url 에서 인 코딩 을 해서 도 사용 할 수 있 습 니 다.하지만 서버 쪽 에 서 는 자동 으로 디 코딩 되 지 않 습 니 다.다음은 PHP 버 전의 디 코딩 함 수 를 제공 합 니 다.매 뉴 얼 에서 찾 습 니 다.

<?php

function unescape($str) { 
  $str = rawurldecode($str); 
  preg_match_all("/(?:%u.{4})|&#x.{4};|&#d+;|.+/U",$str,$r); 
  $ar = $r[0]; 
  foreach($ar as $k=>$v) { 
    if(substr($v,0,2) == "%u") 
      $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4))); 
    elseif(substr($v,0,3) == "&#x") 
      $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1))); 
    elseif(substr($v,0,2) == "&#") { 
      $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1))); 
    } 
  } 
  return join("",$ar); 
}

?>

 

>>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~"));
%20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
>>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~"));
%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~
>>> console.log(escape("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));

*+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
>>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));
!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
결과 비교:
escape 인 코딩 되 지 않 은 문자:*+-./@   총 7 개
encodeURIComponent 인 코딩 되 지 않 은 문자:!()*-. ~  총 9 개
이상 의 이 간단 한 phop 에서 urlencode 와 rawurlencode 의 차 이 는 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기