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); }
URIEncodeComponent の実装プロセスでは、Encode 関数を直接呼び出してエンコードします。これらの文字はエンコードする必要がありません。基本的なプロジェクトは、現在の文字が下位サロゲートである場合、下位サロゲートが上位サロゲートの後に続く必要があるため、エラーが報告されます。次に、現在のバイトが上位サロゲート (cc1 0xDBFF) ではないかどうかを確認し、URIEncodeSingle 関数を直接呼び出してエンコードします。現在の文字エンコーディングが上位サロゲートの場合は、次の桁を削除します。文字列の長さを超えると、次のビットが下位サロゲートでない場合、エラーが報告されます。これは、次のビットが下位サロゲートである場合、上位サロゲートの後に下位サロゲートが続く必要があるためです。関数はサロゲート ペアをエンコードするために呼び出されます。 Encode関数は主に、文字がエンコードの必要のない文字であるか、サロゲートペアであるか、通常の文字であるかを判定します。
URIEncodeSingle 関数の基本プロセスは、文字に対して何らかの操作を実行し、最後に URIEncodeOctets 関数を呼び出してバイト単位でエンコードすることです。最大 Unicode コードは 3 バイトであるため、URIEncodeSingle 関数では配列の長さが 3 として定義されます。 URIEncodePair 関数の基本プロセスは、上位サロゲートと下位サロゲートの合計 4 バイトに対して何らかの操作を実行し、URIEncodeOctets 関数を呼び出して 4 バイトをエンコードすることです。
以上がソースコード解析のためのjsエンコード関数encodeURIComponentの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。