Исходный код алгоритма encodeURIComponent - PullRequest
5 голосов
/ 09 марта 2012

Я занимаюсь разработкой приложения из титана с использованием Javascript.Мне нужна реализация с открытым исходным кодом encodeURIComponent в Javascript.

Кто-нибудь может мне помочь или показать какую-то реализацию?

Ответы [ 3 ]

6 голосов
/ 09 марта 2012

Спецификация для этой функции находится в 15.1.3.4 .


Современные версии (2018) V8 реализуют его на C ++. См. src / uri.h :

// ES6 section 18.2.6.5 encodeURIComponenet (uriComponent)
static MaybeHandle<String> EncodeUriComponent(Isolate* isolate,
                                              Handle<String> component) {

, который вызывает Encode, определенный в uri.cc .


В старых версиях V8 он реализован на JavaScript и распространяется под лицензией BSD. См. Строку 359 из src / uri.js .

// ECMA-262 - 15.1.3.4
function URIEncodeComponent(component) {
  var unescapePredicate = function(cc) {
    if (isAlphaNumeric(cc)) return true;
    // !
    if (cc == 33) return true;
    // '()*
    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;
  };

  var string = ToString(component);
  return Encode(string, unescapePredicate);
}

Он там не называется encodeURIComponent, но этот код в том же файле восстанавливает отображение:

InstallFunctions(global, DONT_ENUM, $Array(
    "escape", URIEscape,
    "unescape", URIUnescape,
    "decodeURI", URIDecode,
    "decodeURIComponent", URIDecodeComponent,
    "encodeURI", URIEncode,
    "encodeURIComponent", URIEncodeComponent
  ));
0 голосов
/ 03 декабря 2018

Вот моя реализация:

var encodeURIComponent = function( str ) {
    var hexDigits = '0123456789ABCDEF';
    var ret = '';
    for( var i=0; i<str.length; i++ ) {
        var c = str.charCodeAt(i);
        if( (c >= 48/*0*/ && c <= 57/*9*/) ||
            (c >= 97/*a*/ && c <= 122/*z*/) ||
            (c >= 65/*A*/ && c <= 90/*Z*/) ||
            c == 45/*-*/ || c == 95/*_*/ || c == 46/*.*/ || c == 33/*!*/ || c == 126/*~*/ ||
            c == 42/***/ || c == 92/*\\*/ || c == 40/*(*/ || c == 41/*)*/ ) {
                ret += str[i];
        }
        else {
            ret += '%';
            ret += hexDigits[ (c & 0xF0) >> 4 ];
            ret += hexDigits[ (c & 0x0F) ];
        }
    }
    return ret;
};
0 голосов
/ 09 марта 2012

Зачем вам нужен кодер-трикомпонент?Он уже присутствует в JS.

В любом случае, вот пример реализации:

http://phpjs.org/functions/rawurlencode:501#comment_93984

...