Soru Ne zaman encodeURI / encodeURIComponent yerine kaçış kullanmalısınız?


Bir web sunucusuna gönderilecek bir sorgu dizgisini kodlarken - ne zaman kullanıyorsunuz? escape() ve ne zaman kullanıyorsun encodeURI() veya encodeURIComponent():

Kaçış kullanın:

escape("% +&=");

VEYA

encodeURI () / encodeURIComponent () kullan

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

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

1285
2017-09-16 19:24


Menşei


Bunu işaret etmeye değer encodeURIComponent("var1=value1&var2=value2") olduğu değil Tipik kullanım durumu. Bu örnek kodlayacak = ve &Muhtemelen amaçlanan değil! encodeURIComponent Genellikle her anahtar değer çiftindeki değere ayrı olarak uygulanır (her bölümden sonraki bölüm) =). - Timothy Shields
Anahtar için bir şey yapman gerekiyor mu? Ya içinde bir = varsa? (bu mümkün mü?) - Mala
@Mala Genel olarak web programlama için hala yeni, ancak sınırlı deneyimimde kullandığım şey, anahtar ve değeri ayrı ayrı kodlamaktır, böylece '=' kalır: var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);- Belki başka biri daha iyi bir yol bilir. - nedshares
@nedshares Ben bununla oynuyordum ama anlayabildiğim kadarıyla anahtarın şifrelenmiş gibi görünmemesi ... en azından aynı şekilde değil. Belki de anahtara sahip olmak için özeldir. - Mala
Ayrıca, yeni JavaScript uygulamalarının daha üst düzey arayüzler sağladığına da dikkat çekmelisiniz. URL ve URLSearchParams URL'leri ve bunların sorgu dizelerini işlemek için. - Bart Robinson


Cevaplar:


kaçış()

Kullanma! escape() bölümde tanımlanmıştır B.2.1.2 kaçış ve Ek B'nin giriş metni diyor:

... Bu ekte belirtilen tüm dil özellikleri ve davranışları bir veya daha fazla istenmeyen özelliğe sahiptir ve eski kullanımın yokluğunda bu belirtimden kaldırılacaktır. ...
  ... Programcılar yeni ECMAScript kodu yazarken bu özelliklerin ve davranışların varlığını kullanmamalı veya varsaymamalıdır.

Davranış:

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

Özel karakterler şu kurallarla kodlanır: @ * _ + -. /

Kod birimi değeri 0xFF veya daha az olan karakterler için onaltılı form, iki basamaklı bir çıkış dizisidir: %xx.

Daha büyük kod birimine sahip karakterler için dört basamaklı biçim %uxxxx kullanıldı. Bir sorgu dizesi içinde buna izin verilmez. RFC3986):

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

Yüzde işareti yalnızca iki hexdigits takip ediyorsa izin verilir, yüzde u Müsade edilmez.

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 edeceği ve döneceği için encodeURIComponent öğesini çağırma

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 öğesinden kaçmadığını unutmayın. ' karakter. Ortak bir hata, html öznitelikleri oluşturmak için kullanmaktır. href='MyUrl'Bir enjeksiyon hatası yaşayabilir. Dizelerden html oluşturuyorsanız, ya " yerine ' özellik alıntıları için veya ek bir kodlama katmanı ekleyin (' % 27 olarak kodlanabilir).

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


1816
2018-05-24 06:54



@Francois, alıcı sunucuya bağlı olarak, kaçışın ASCII veya ASCII olmayan karakterleri nasıl kodlayacağını doğru şekilde çözemeyebilir: Örneğin, Python'un FieldStorage sınıfı, şifreli güle kaçarsa yukarıdaki dizgeyi düzgün şekilde çözmez. - Ray
@Francois escape (), harfler, rakamlar ve *@-_+./ hariç un 128 (ASCII) karakterlerini kodlar, unescape () ise escape () 'ın tersidir. Anlayabildiğim kadarıyla, URL'leri kodlamak için tasarlanmış eski işlevlerdir ve yalnızca geriye dönük uyumluluk için hala uygulanmaktadırlar. Genellikle, onlar için tasarlanmış bir uygulama / web hizmeti / etc ile etkileşimde bulunmadıkça kullanılmamalıdırlar. - Anthony DiSanti
Tabii ki bir URL'yi URI bileşeni olarak çağırmaya çalışmayın, bu durumda kodlamakURIComponent'i çağırın. - tom
Neden tek teklifle başa çıkmıyor? - Eric
Tek bir alıntı, bir URI içinde gerçekleşmesi için tamamen geçerli bir karakter olduğundan, tek tırnak işareti kodlamaz.-3986). Sorun, HTML içinde bir URI yerleştirdiğinizde, tek tırnak işaretinin bulunduğu yerde oluşur. değil geçerli bir karakter. O zaman, URI'ların aynı zamanda "HTML-kodlanmış" olması gerekir ( ' ile 'bir HTML belgesine yerleştirilmeden önce. - Lee


Arasındaki fark encodeURI() ve encodeURIComponent() encodeURIComponent tarafından kodlanan tam 11 karakterdir, ancak encodeURI tarafından değil:

Table with the ten differences between encodeURI and encodeURIComponent

Bu tabloyu kolayca console.table Google Chrome’da bu kodla:

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);


391
2017-10-09 09:26



Netlik için +1 ve bir diğeri de konsol için. - bladnman
Bu tarayıcı bağımlı değil mi? - Pacerier
@bladnman encodeURI ve encodeURIComponent tüm büyük tarayıcılarda bu şekilde çalışmalıdır. Yukarıdaki kodu Chrome ve Firefox’ta her iki destek konsolu olarak test edebilirsiniz. Diğer tarayıcılarda (Firefox ve Chrome dahil) aşağıdaki kodu kullanabilirsiniz: var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) } - Johann Echavarria
Ben @Pacerier demek istedim :) - Johann Echavarria
BU SINIF ZAMANLARININ GELECEĞİ İHTİYACIM VAR! Maalesef sadece bir kez bile olabilir. - Ramazan Polat


Bu makaleyi aydınlatan buldum: Javascript Çılgınlığı: Sorgu Dizesi Ayrıştırma

Dekont yapmaya çalıştığımda, decodeURIComponent '+' nı neden doğru çözmediğini buldum. İşte ö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
2018-05-08 07:51



Bağladığınız makale çok saçmalık içeriyor. Bana öyle geliyor ki, yazar kendi işlevlerinin ne için uygun şekilde kullanıldığını anlamadı ... - Christoph
@Christoph Hepsi bana mantıklı geliyor. Özellikle, ona katılıyorum encodeURI Oldukça anlaşılması zor bir durumda sadece yararlı ve gerçekten ihtiyaç yok gibi görünüyor. Onunla bazı fikir ayrılıklarım var, ama ben orada tam olarak yanlış ya da aptalca bir şey görmüyorum. Tam olarak ne düşünüyorsun saçmalık? - Mark Amery
enctype özniteliği FORM Öğe, sunucuya gönderilmek üzere form veri kümesini kodlamak için kullanılan içerik türünü belirtir. Uygulama / x-www-form-urlencoded    Bu varsayılan içerik türüdür. Bu içerik türüyle gönderilen formlar aşağıdaki gibi kodlanmalıdır: [...] Boşluk karakterleri `` + 'ile değiştirilir ve [...] Alfasayısal olmayan karakterler% HH ile değiştirilir, [...]  Ref: HTML4 Sepc - cychoi
decodeURIComponent ("A +% 2B + B" .replace (/ \ + / g, "")) = "A + B" - Nicholas
encodeURIComponent ('A + B'). değiştirin (/ \% 20 / g, '+') + '\ n' + decodeURIComponent ("A +% 2B + B" .replace (/ \ + / g, '% 20') )); - Zlatin Zlatev


encodeURIComponent kodlamaz -_.!~*'()xml dizesinde php'ye veri göndermede sorun yaratıyor.

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

Genel kaçış encodeURI
%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örebilirsiniz, tek alıntı kodlanmamış. Sorunu çözmek için projemdeki sorunu çözmek için URL kodlamak üzere iki işlev 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");
}

Kod Çözme iç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 "";
}

37
2017-09-16 19:26



Ayrıca% 23 olan # (pound / hash / number) işaretini de yapmaz. - xr280xr


encodeURI () - escape () işlevi, HTTP'den kaçan javascript içindir.


36
2017-10-08 15:20



Böyle bir URL'im varsa: var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"... Buna Google Ajax API'sı aracılığıyla erişmek istiyorum. var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;... sonra kullanmak zorundayım escape(url). encodeURI(url) göründüğü gibi parametrelerle çalışmıyor. - Lance Pollard
ecnodeURIComponent (url) kullanmalı - Ustaman Sangat
Tüm 3 fonksiyonun kendi sorunları vardır. İşi yapan kendi fonksiyonunuzu yaratmak daha iyidir. - Jerry Joseph


Küçük karşılaştırma tablosu Java vs 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

14
2017-09-16 19:40



Burada benzer bir şey: the-art-of-web.com/javascript/escape - Christophe Roussy
kanka. Bunu ilanı için salladın! - williamle8300


Ayrıca hepsinin farklı karakter kümelerini kodladığını ve uygun bir şekilde ihtiyacınız olanı seçtiğini unutmayın. encodeURI (), daha az sayıda (ve aynı zamanda dannyp'in noktasından farklı olan) karakterleri kaçış () 'dan kodlayan encodeURIComponent () öğesinden daha az karakter kodlar.


10
2018-04-23 16:54





Bu yöntemlerden birini kullanılmamasını tavsiye ederim. Doğru şeyi yapan kendi fonksiyonunuzu yazın.

MDN, aşağıda gösterilen URL kodlaması konusunda iyi bir örnek verdi.

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


9
2018-04-21 07:55



Ne harika bir cevap (eğer herhangi bir hata yapmadan chrome kenarında ve firefox'ta uyumluysa) - yan bellavance
Bu cevap daha fazla yükseltmeyi hak ediyor. - Adam


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

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

  2. encodeURI () - kodlamaz ~!@#$&*()=:/,;?+' URI'nin tam bir URI olduğunu varsayar, dolayısıyla URI'da özel anlamı olan ayrılmış karakterleri kodlamaz. Bu yöntem, amaç, belirli bir URL segmentinin yerine tam URL'yi dönüştürmek olduğunda kullanılır. Örnek - encodeURI('http://stackoverflow.com'); verecek - http://stackoverflow.com

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

Tüm bu kodlamalar UTF 8'de gerçekleştirilir, yani karakterler UTF-8 formatında dönüştürülür. 

encodeURIComponent, encodeURI'den ayırt edilir, böylece ayrılmış karakterleri kodlar ve encodeURI'nin Number sign #


5
2017-08-08 12:34





Çeşitli yöntemlerle denemenin, çeşitli kullanımlarının ve yeteneklerinin ne olduğunun iyi bir şekilde ele alınmasından sonra bile iyi bir sağlık kontrolü olduğunu gördüm.

Sonuna doğru buldum bu web sitesi Şüphe duyduğumu doğrulamak için son derece yararlıdır. Ayrıca, yorumlanması oldukça zor olabilen bir encodeURIComponent'ed dizesinin deşifre edilmesi için yararlı olduğu kanıtlanmıştır. Sahip olması gereken harika bir yer imi:

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


3
2018-06-21 12:39