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; // '()* 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); }
Le processus d'implémentation de URIEncodeComponent consiste à appeler directement la fonction Encode pour l'encodage. Tout d'abord, utilisez la fonction unescapePredicate pour ignorer certains caractères spéciaux. Ces caractères n'ont pas besoin d'être encodés. . Voir le code pour plus de détails. Le projet de base consiste à parcourir caractère par caractère. Si le caractère actuel est un substitut bas, une erreur sera signalée (cc1 >= 0xDC00 && cc1 <= 0xDFFF) car le substitut bas doit suivre le substitut haut. Déterminez ensuite si l'octet actuel n'est pas un substitut élevé (cc1 < 0xD800 || cc1 > 0xDBFF), puis appelez directement la fonction URIEncodeSingle pour le codage. Si le caractère actuel est codé en tant que substitut élevé, supprimez le chiffre suivant If. la longueur de la chaîne est dépassée, une erreur sera signalée. Si le bit suivant n'est pas un substitut faible, une erreur sera signalée, car le substitut élevé doit être suivi d'un substitut faible. La fonction URIEncodePair est appelée pour coder la paire de substitution. La fonction Encode détermine principalement si le caractère est un caractère qui ne nécessite pas de codage, s'il s'agit d'une paire de substitution et s'il s'agit d'un caractère ordinaire.
Le flux de base de la fonction URIEncodeSingle consiste à effectuer une sorte d'opération sur un caractère, et enfin à appeler la fonction URIEncodeOctets pour coder par octets. Le code Unicode maximum est de trois octets, donc la longueur du tableau est définie sur 3 dans la fonction URIEncodeSingle. Le processus de base de la fonction URIEncodePair consiste à effectuer une opération sur les substituts haut et bas. Les substituts haut et bas représentent quatre octets au total, puis à appeler la fonction URIEncodeOctets pour coder les quatre octets.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!