it-swarm-tr.com

Ne zaman encodeURI/encodeURIComponent yerine escape kullanmanız gerekir?

Bir web sunucusuna gönderilecek bir sorgu dizesini kodlarken - ne zaman escape() ve ne zaman encodeURI() veya encodeURIComponent() kullanırsınız:

Kaçış kullanın:

escape("% +&=");

OR

encodeURI ()/encodeURIComponent () kullanın

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");
1323
Adam

kaçış()

Kullanmayın! escape(), B.2.1.2 escape ve Ek B 'nin tanıtım metni bölümünde tanımlanmıştır:

... Bu ekte belirtilen tüm dil özellikleri ve davranışları, bir veya daha fazla istenmeyen özelliklere sahiptir ve eski kullanımın yokluğunda bu şartnameden çıkarılacaktır. ...
... Programcılar, yeni ECMAScript kodu yazarken bu özelliklerin ve davranışların varlığını kullanmamalı veya üstlenmemelidir.

Davranış:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

Özel karakterler aşağıdakiler dışında kodlanır: @ * _ + -. /

Kod birimi değeri 0xFF veya daha az olan karakterlerin onaltılık biçimi iki basamaklı bir kaçış dizisidir: %xx.

Daha büyük kod birimine sahip karakterler için dört basamaklı format %uxxxx kullanılır. Buna bir sorgu dizgisinde izin verilmez ( RFC3986 içinde tanımlandığı şekilde):

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Yüzde işaretine yalnızca doğrudan iki altı basamaklı kareler gelirse izin verilir, yüzde onu izleyen u izin verilmez.

encodeURI ()

Çalışan bir URL istediğinizde encodeURI kullanın. Bu aramayı yap:

encodeURI("http://www.example.org/a file with spaces.html")

almak:

http://www.example.org/a%20file%20with%20spaces.html

URL'yi yok edip geri vereceği için encodeURIComponent'i arama

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent ()

Bir URL parametresinin değerini kodlamak istediğinizde encodeURIComponent kullanın.

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

Ardından ihtiyacınız olan URL’yi oluşturabilirsiniz:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

Ve bu tam URL’yi alacaksınız:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

EncodeURIComponent öğesinin ' karakterinden kaçmadığını unutmayın. Yaygın bir hata, onu bir enjeksiyon hatası çekebilecek href='MyUrl' gibi html öznitelikleri oluşturmak için kullanmaktır. Dizelerden html oluşturuyorsanız, özellik tırnakları için " yerine ' kullanın veya fazladan bir kodlama katmanı ekleyin ('% 27 olarak kodlanabilir).

Bu kodlama türü hakkında daha fazla bilgi için aşağıdakileri kontrol edebilirsiniz: http://en.wikipedia.org/wiki/Percent-encoding

1847
Arne Evertsson

encodeURI() ve encodeURIComponent() arasındaki fark, encodeURIComponent tarafından kodlanan ancak encodeURI tarafından kodlanan tam 11 karakterdir:

Table with the ten differences between encodeURI and encodeURIComponent

Bu tabloyu console.table ile Google Chrome'da bu kodla kolayca oluşturdum:

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.Push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);

411

Aydınlatıcı bu yazıyı buldum: Javascript Madness: Query String Parsing

DecodeURIComponent'in neden '+' kodunu doğru şekilde çözmediğini anlamaya çalışırken buldum. İşte bir özü:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!
43
Damien

encodeURIComponent -_.!~*'() dosyasını kodlamaz, bu da xml dizesinde php'ye veri gönderiminde sorun yaratır.

Örneğin:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

encodeURI ile genel kaçış
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

Gördüğünüz gibi, tek bir alıntı kodlanmış değildir .. .. Sorunu çözmek için Projemdeki sorunu çözmek için iki kod oluşturdum:

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

URL'yi Çözmek İçin:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}
38

encodeURI () - escape () işlevi HTTP değil, javascript çıkış için kullanılır.

37
Daniel Papasian

Küçük karşılaştırma tablosu Java - JavaScript vs. PHP.

1. Java URLEncoder.encode (using UTF8 charset)
2. JavaScript encodeURIComponent
3. JavaScript escape
4. PHP urlencode
5. PHP rawurlencode

char   Java JavaScript --PHP---
[ ]     +    %20  %20  +    %20
[!]     %21  !    %21  %21  %21
[*]     *    *    *    %2A  %2A
[']     %27  '    %27  %27  %27 
[(]     %28  (    %28  %28  %28
[)]     %29  )    %29  %29  %29
[;]     %3B  %3B  %3B  %3B  %3B
[:]     %3A  %3A  %3A  %3A  %3A
[@]     %40  %40  @    %40  %40
[&]     %26  %26  %26  %26  %26
[=]     %3D  %3D  %3D  %3D  %3D
[+]     %2B  %2B  +    %2B  %2B
[$]     %24  %24  %24  %24  %24
[,]     %2C  %2C  %2C  %2C  %2C
[/]     %2F  %2F  /    %2F  %2F
[?]     %3F  %3F  %3F  %3F  %3F
[#]     %23  %23  %23  %23  %23
[[]     %5B  %5B  %5B  %5B  %5B
[]]     %5D  %5D  %5D  %5D  %5D
----------------------------------------
[~]     %7E  ~    %7E  %7E  ~
[-]     -    -    -    -    -
[_]     _    _    _    _    _
[%]     %25  %25  %25  %25  %25
[\]     %5C  %5C  %5C  %5C  %5C
----------------------------------------
char  -Java-  --JavaScript--  -----PHP------
[ä]   %C3%A4  %C3%A4  %E4     %C3%A4  %C3%A4
[ф]   %D1%84  %D1%84  %u0444  %D1%84  %D1%84
16
30thh

Bu yöntemlerden birini olduğu gibi kullanmamanızı tavsiye ederim. Doğru olanı yapan kendi fonksiyonunuzu yazın.

MDN, aşağıda gösterilen url kodlamasına iyi bir örnek vermiştir.

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName);

console.log(header); 
// logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"


function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            //  so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

11
Jerry Joseph

Ayrıca, hepsinin farklı karakter kümelerini kodladığını ve uygun olanı seçtiğini de unutmayın. encodeURI (), encodeURIComponent () öğesinden daha az karakter kodlar;.

10
Pseudo Masochist

Javascript kodlama amacıyla üç dahili fonksiyon vermiştir -

  1. escape () - kodlamaz @*/+ Bu yöntem ECMA 3'ten sonra kullanımdan kaldırılmıştır, bu nedenle kaçınılması gerekir.

  2. encodeURI () - [email protected]#$&*()=:/,;?+' kodlamaz • URI'nın eksiksiz bir URI olduğunu varsayar, bu nedenle URI'da özel bir anlamı olan ayrılmış karakterleri kodlamaz. Bu yöntem, URL’nin bazı özel bölümleri yerine URL’nin tamamını dönüştürmenin amacı olduğunda kullanılır. Örnek - encodeURI('http://stackoverflow.com'); verecek - http://stackoverflow.com

  3. encodeURIComponent () - kodlama yapmaz - _ . ! ~ * ' ( ) Bu işlev, belirli karakterlerin her bir örneğini, UTF-8 kodlamasını temsil eden bir, iki, üç veya dört kaçış dizisiyle değiştirerek bir Tekdüzen Kaynak Tanımlayıcı (URI) bileşenini kodlar. Bir URL'nin bir bileşenini dönüştürmek için bu yöntem kullanılmalıdır. Örneğin bazı kullanıcı girişlerinin eklenmesi gerekiyor Örnek - encodeURI('http://stackoverflow.com'); verecek - http% 3A% 2F% 2Fstackoverflow.com

Bütün bu kodlama UTF 8'de yapılır, yani karakterler UTF-8 formatında dönüştürülür.

encodeURIComponent, encodeURI'den ayrılmış karakterleri ve encodeURI sayı işaretlerini kodlamasından farklıdır

7
Gaurav Tiwari

Çeşitli yöntemlerle deney yapmanın, çeşitli kullanım ve yeteneklerinin ne olduğunu iyi bir şekilde ele aldıktan sonra bile iyi bir sağlık kontrolü olduğunu gördüm.

Bu amaca doğru buldum bu web sitesini / uygun bir şey yaptığım şüphelerimi doğrulamak için son derece yararlı. Ayrıca yorumlaması oldukça zor olabilecek bir encodeURIComponent'ed dizgisinin kodunu çözmek için de faydalı olduğu kanıtlanmıştır. Sahip olmak için harika bir yer imi:

http://www.the-art-of-web.com/javascript/escape/

3
veeTrain

Bu fonksiyona sahibim ...

var escapeURIparam = function(url) {
    if (encodeURIComponent) url = encodeURIComponent(url);
    else if (encodeURI) url = encodeURI(url);
    else url = escape(url);
    url = url.replace(/\+/g, '%2B'); // Force the replacement of "+"
    return url;
};
1
molokoloco

Kabul edilen cevap iyidir.

EncodeURIComponent öğesinin 'karakterinden kaçmadığını unutmayın. Ortak Buradaki hata href = 'MyUrl', hangi bir enjeksiyon hatası yaşayabilir. Eğer html yapıyorsanız dizeleri, öznitelik tırnakları için "yerine" yerine "kullanın ya da bir

Güvenli tarafta olmak istiyorsanız, yüzde ayrılmamış karakter kodlaması da kodlanmalıdır. 

Onlardan kaçmak için bu yöntemi kullanabilirsiniz (kaynak Mozilla )

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

// fixedEncodeURIComponent("'") --> "%27"
1
Michael

@ Johann-echavarria'nın cevabının modern tekrarı:

console.log(
    Array(256)
        .fill()
        .map((ignore, i) => String.fromCharCode(i))
        .filter(
            (char) =>
                encodeURI(char) !== encodeURIComponent(char)
                    ? {
                          character: char,
                          encodeURI: encodeURI(char),
                          encodeURIComponent: encodeURIComponent(char)
                      }
                    : false
        )
)

Veya bir tablo kullanabiliyorsanız, console.log __ console.table ile değiştirin (daha güzel çıktılar için).

1
ryanpcmcquen

Johann'ın masasından ilham alan , masayı genişletmeye karar verdim. Hangi ASCII karakterlerin kodlandığını görmek istedim.

 screenshot of console.table

var ascii = " !\"#$%&'()*+,-./0123456789:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

var encoded = [];

ascii.split("").forEach(function (char) {
    var obj = { char };
    if (char != encodeURI(char))
        obj.encodeURI = encodeURI(char);
    if (char != encodeURIComponent(char))
        obj.encodeURIComponent = encodeURIComponent(char);
    if (obj.encodeURI || obj.encodeURIComponent)
        encoded.Push(obj);
});

console.table(encoded);

Tablo sadece kodlanmış karakterleri göstermektedir. Boş hücreler, orijinal ve kodlanmış karakterlerin aynı olduğu anlamına gelir.


Fazladan olmak gerekirse, urlencode() vs rawurlencode() için başka bir tablo ekliyorum. Tek fark boşluk karakterinin kodlanması gibi görünüyor.

 screenshot of console.table

<script>
<?php
$ascii = str_split(" !\"#$%&'()*+,-./0123456789:;<=>[email protected][\\]^_`abcdefghijklmnopqrstuvwxyz{|}~", 1);
$encoded = [];
foreach ($ascii as $char) {
    $obj = ["char" => $char];
    if ($char != urlencode($char))
        $obj["urlencode"] = urlencode($char);
    if ($char != rawurlencode($char))
        $obj["rawurlencode"] = rawurlencode($char);
    if (isset($obj["rawurlencode"]) || isset($obj["rawurlencode"]))
        $encoded[] = $obj;
}
echo "var encoded = " . json_encode($encoded) . ";";
?>
console.table(encoded);
</script>
0
akinuri