Views 5990 Votes 0 Comment 0
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
가-끔 올라오는 주제인듯 싶어서 슬쩍 써둡니다.

알아두기
우선 분명히 해야할 점은, 자바스크립트 자체에서 escape()와 unescape()는 사용이 배제되는, 권장하지 않는 함수입니다. 자바스크립트 1.5부터는 encodeURI(), decodeURI() 함수의 사용을 권장하며, ECMA 스크립트(자바스크립트의 표준안입니다) 리비전 3부터 이쪽을 사용하게 되어있습니다. 브라우저에서는 넷스케이프 6, IE 5.5, 모질라(언제부터인지 조사 안함. 1.5에서는 잘 됩니다) 이상에서 잘 지원됩니다. encodeURI(), decodeURI()는 PHP의 rawurlencode(), rawurldecode()와 완벽하게 호환됩니다.

escape()의 작동 원리
escape()는 영숫자 및 * @ - _ + . /를 제외한 모든 문자를 별도의 방법으로 처리합니다. ASCII 코드의 문자는 %xx 형태로 변경하며, 그 외의 문자는 %uxxxx로 나타나는 유니코드로 처리합니다. (반면 encodeURI()는 제외 문자 이외는 전부 %xx 형태로 변환합니다)

escape() 문자열 받기, PHP js_unescape() 함수
이 함수를 사용하려면, ctype 모듈(기본값으로 들어갑니다), 그리고 이후 변환을 위한 iconv 모듈이 필요합니다. 자바스크립트 escape()로 만들어진 문자열이 아닐 경우(% 변환 오류시) 반환값은 boolean FALSE입니다.

js_unescape() 소스
function js_unescape($src) {
  $len = strlen($src);
  $dst = array();

  for ($i = 0; $i < $len; $i++) {
    if ($src{$i} == '%') {
      if (isset($src{$i+5}) && $src{$i+1} == 'u' &&
        ctype_xdigit($src{$i+2} . $src{$i+3} . $src{$i+4} .  $src{$i+5})) {

        $dst[] = chr(hexdec($src{$i+2} . $src{$i+3}));
        $dst[] = chr(hexdec($src{$i+4} . $src{$i+5}));
        $i += 5;
      } elseif (isset($src{$i+2}) &&
        ctype_xdigit($src{$i+1} . $src{$i+2})) {

        $dst[] = chr(0);
        $dst[] = chr(hexdec($src{$i+1} . $src{$i+2}));
        $i += 2;
      } else {
        return FALSE;
      }
    } elseif ($src{$i} >= 0x20 && $src{$i} <= 0x7E) {
      $dst[] = chr(0);
      $dst[] = $src{$i};
    } else {
      return FALSE;
    }
  }

  return implode('', $dst);
}

js_unescape() 함수 사용법
이 함수가 반환하는 문자열은 유니코드이므로, 문자열을 받으려면 다음과 같은식으로 사용을 해야합니다.
UTF-8 부분을 원하는 인코딩으로 바꾸면 됩니다. (예: EUC-KR)
$unescaped_string = js_unescape($escaped_string);
$original_string  = iconv('ISO-10646-UCS-2', 'UTF-8', $unescaped_string);

소스 이해하기
전체를 설명하진 않겠습니다.
이해를 돕기 위한 간단한 설명일 뿐입니다.

$src{$i}
이는 문자열에서 한 문자를 가져오는 방법입니다. C에서는 문자열을 문자의 집합을 나타내는 포인터로 다루기 때문에 자주 쓰이지만, PHP로 시작한 분은 처음볼지도 모르겠습니다. $src = "ABCDEFG"라고 할 경우, $src{0}는 'A'를, $src{5}는 'F'를 나타내는 방식입니다.

$dst[] = chr(0);
이는 유니코드(UCS-2)의 인코딩 방식으로 인해 들어가는 부분입니다. UCS-2인코딩은 다른 인코딩과는 달리, 영숫자 등도 2바이트를 차지하게 되어있습니다. 즉, 'A'의 코드값이 0x41이 아닌, 0x0041입니다. 이를 채워넣기 위함입니다.

끝맺음
마지막으로 강조하지만, 자바스크립트에서 인코드할때는 encodeURI(), decodeURI()를 우선적으로 고려해보시기 바랍니다. 여담으로, 문자열을 포인터로 다룰 수 없었던게 매우 귀찮았다는게 만들면서 든 생각이였습니다 -ㅅ- 혹시 오류라던지가 발생하면 알아서 고치십시오. 이 소스에 대한 모든 권리와 의무는 포기합니다.

http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=26218 - 참고

?

List of Articles
No. Category Subject Author Date Views
597 Develop [doc] 유료 방송 제어 시스템 (CAS) 발표자료 file hooni 2013.04.23 8509
596 Develop [c++] 웹폼(webform)전송과 http 파일 업로드 샘플 file hooni 2013.04.23 33077
595 Develop [c++] 디렉토리 내의 파일 찾기 FindFirstFile() 함수 6 hooni 2013.04.23 20587
594 Develop [c++] 가짜 인증서(하나은행) 프로그램 file hooni 2013.04.23 10761
593 Develop [js] 이미지 사이즈를 동적으로 조절.. hooni 2013.04.23 7474
592 Develop [js] 부모창에서 자식창으로 문자열 전달.. file hooni 2013.04.23 7458
591 Develop [c#] 툴바 소스.. 개인적으로 만드는거.. secret hooni 2013.04.23 3304
590 Develop [php] 그래프 그리는 프로그램.. file hooni 2013.04.23 8471
589 Develop [js] 네이버에서 그림 퍼올 때.. URL Encoding 관련ㅋㅋ hooni 2013.04.23 7223
588 Develop [linux] 날짜나 파일의 내용으로 검색하는 방법(find 명령 사용) hooni 2013.04.23 8121
587 Develop [c++] 현승이가 준 메신저 소스.. ㅋㅋ file hooni 2013.04.23 8275
586 Develop [c] 아파치 모듈(Apache Module) 만들기 hooni 2013.04.23 8606
585 Develop [c++] MFC로 만든 디렉토리/파일 파인더 file hooni 2013.04.23 9327
584 Develop [c++] 데이터 압축 프로그램 소스 (lzw) file hooni 2013.04.23 9939
583 Develop [c++] 압축프로그램(Lite Zip) 샘플 file hooni 2013.04.23 8607
582 Develop [c#] HTML 이벤트 샘플 소스.. file hooni 2013.04.23 7739
Board Pagination Prev 1 ... 35 36 37 38 39 ... 74 Next
/ 74