>  기사  >  웹 프론트엔드  >  소스 코드 분석을 위해 js 인코딩 함수 encodeURIComponent를 사용하는 방법

소스 코드 분석을 위해 js 인코딩 함수 encodeURIComponent를 사용하는 방법

一个新手
一个新手원래의
2017-09-27 10:21:011582검색


function URIAddEncodedOctetToBuffer(octet, result, index) {
  result[index++] = 37; // Char code of '%'.
  result[index++] = hexCharCodeArray[octet >> 4];
  result[index++] = hexCharCodeArray[octet & 0x0F];  return index;
}function URIEncodeOctets(octets, result, index) {
  if (hexCharCodeArray === 0) {    // 0-F
    hexCharCodeArray = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57,                        65, 66, 67, 68, 69, 70];
  }
  index = URIAddEncodedOctetToBuffer(octets[0], result, index);  if (octets[1]) index = URIAddEncodedOctetToBuffer(octets[1], result, index);  if (octets[2]) index = URIAddEncodedOctetToBuffer(octets[2], result, index);  if (octets[3]) index = URIAddEncodedOctetToBuffer(octets[3], result, index);  return index;
}// 对unicode中除了代理对外的字符编码function URIEncodeSingle(cc, result, index) {
  var x = (cc >> 12) & 0xF;  var y = (cc >> 6) & 63;  var z = cc & 63;  // unicode最多值是三个字节
  var octets = new InternalArray(3);  // ascii码
  if (cc <= 0x007F) {
    octets[0] = cc;
  } else if (cc <= 0x07FF) {
    octets[0] = y + 192;
    octets[1] = z + 128;
  } else {
    octets[0] = x + 224;
    octets[1] = y + 128;
    octets[2] = z + 128;
  }  return URIEncodeOctets(octets, result, index);
}function URIEncodePair(cc1 , cc2, result, index) {
  var u = ((cc1 >> 6) & 0xF) + 1;  var w = (cc1 >> 2) & 0xF;  var x = cc1 & 3;  var y = (cc2 >> 6) & 0xF;  var z = cc2 & 63;  var octets = new InternalArray(4);
  octets[0] = (u >> 2) + 240;
  octets[1] = (((u & 3) << 4) | w) + 128;
  octets[2] = ((x << 4) | y) + 128;
  octets[3] = z + 128;  return URIEncodeOctets(octets, result, index);
}// ECMA-262, section 15.1.3function Encode(uri, unescape) {
  uri = TO_STRING(uri);  var uriLength = uri.length;  var array = new InternalArray(uriLength);  var index = 0;  for (var k = 0; k < uriLength; k++) {    var cc1 = %_StringCharCodeAt(uri, k);    if (unescape(cc1)) {      array[index++] = cc1;
    } else {      if (cc1 >= 0xDC00 && cc1 <= 0xDFFF) throw MakeURIError();      // 非高代理项
      if (cc1 < 0xD800 || cc1 > 0xDBFF) {
        index = URIEncodeSingle(cc1, array, index);
      } else {        // 高代理项
        k++;        if (k == uriLength) throw MakeURIError();        var cc2 = %_StringCharCodeAt(uri, k);        // 不是合法的低代理项
        if (cc2 < 0xDC00 || cc2 > 0xDFFF) throw MakeURIError();
        index = URIEncodePair(cc1, cc2, array, index);
      }
    }
  }  var result = %NewString(array.length, NEW_ONE_BYTE_STRING);  for (var i = 0; i < array.length; i++) {
    %_OneByteSeqStringSetChar(i, array[i], result);
  }  return result;
}// ECMA-262 - 15.1.3.4function URIEncodeComponent(component) {
  var unescapePredicate = function(cc) {
    if (isAlphaNumeric(cc)) return true;    // !
    if (cc == 33) return true;    // &#39;()*
    if (39 <= cc && cc <= 42) return true;    // -.
    if (45 <= cc && cc <= 46) return true;    // _
    if (cc == 95) return true;    // ~
    if (cc == 126) return true;    return false;
  };  return Encode(component, unescapePredicate);
}

URIEncodeComponent 구현 과정은 인코딩을 위한 Encode 함수를 직접 호출하는 것입니다. 먼저 unescapePredicate 함수를 사용하여 일부 특수 문자를 건너뛸 수 있습니다. 자세한 내용은 코드를 참조하세요. 기본 프로젝트는 문자별로 이동하는 것입니다. 현재 문자가 하위 서로게이트인 경우 하위 서로게이트가 상위 서로게이트를 따라야 하기 때문에 오류가 보고됩니다(cc1 >= 0xDC00 && cc1 6dc00a99abd55bed7eba8fae3123bcf6 0xDBFF)인지 확인한 다음 URIEncodeSingle 함수를 직접 호출하여 현재 문자 인코딩이 상위 대체인 경우 다음 숫자를 제거합니다. 문자열 길이를 초과하면 오류가 보고됩니다. 다음 비트가 하위 서로게이트가 아니면 오류가 보고됩니다. 왜냐하면 상위 서로게이트 뒤에 하위 서로게이트가 와야 하기 때문입니다. 서로게이트 쌍을 인코딩하기 위해 함수가 호출됩니다. Encode 기능은 주로 해당 문자가 인코딩이 필요하지 않은 문자인지, 대리 쌍인지, 일반 문자인지 여부를 확인합니다.
URIEncodeSingle 함수의 기본 흐름은 문자에 대해 일종의 작업을 수행하고 마지막으로 URIEncodeOctets 함수를 호출하여 바이트 단위로 인코딩하는 것입니다. 최대 유니코드 코드는 3바이트이므로 URIEncodeSingle 함수에서는 배열 길이가 3으로 정의됩니다. URIEncodePair 함수의 기본 프로세스는 상위 및 하위 서로게이트에 대해 일부 작업을 수행한 다음, URIEncodeOctets 함수를 호출하여 4바이트를 인코딩하는 것입니다.

위 내용은 소스 코드 분석을 위해 js 인코딩 함수 encodeURIComponent를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.