URL'leri kodlamak için encodeURI veya encodeURIComponent kullanmalı mıyım?


282

URL'leri kodlamak için bu iki yöntemden hangisi kullanılmalıdır?



13
Önemli bir fark encodeURIkodlamayacak olmasıdır /: encodeURIComponent("ac/dc")=> ac%2Fdcve encodeURI("ac/dc")=>ac/dc

Bu yardımcı olabilir: "encodeURIComponent() and encodeURI() encode a URI by replacing URL reserved characters with their UTF-8 encoding....They differ because encodeURI does not encode queryString or hash values...URLs do not allow many special characters, like spaces or slashes. However these special characters are part of life, so URL encoding was invented." Kaynak
user1063287

Ayrıca encodeURIComponent differs from encodeURI as followsşu başlıktaki özel bölüme bakın : developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
user1063287 7:19

Yanıtlar:


324

Aslında ne yapmak istediğinize bağlıdır.

encodeURI, girdinin, içinde kodlanması gereken bazı karakterlere sahip olabilecek eksiksiz bir URI olduğunu varsayar.

encodeURIComponent her şeyi özel bir anlamla kodlar, böylece onu URI'lerin bileşenleri için kullanırsınız.

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

108

Bir URL bileşenine (querystring parametresi) koymak için bir dize kodluyorsanız, aramanız gerekir encodeURIComponent.

Mevcut bir URL'yi kodluyorsanız arayın encodeURI.


1
Eğer ajax kullanıyorsanız nasıl php geçirilen url kodunu çözmek?
Aditya Shukla

6
Yapmazsın. Web sunucusu bunu otomatik olarak yapar.
Quentin

@Aditya: Ne yaptığınıza bağlı.
SLaks

Ben php onları almak istiyorum olsun olsun yoluyla parametreleri geçiyorum.
Aditya Shukla

2
İyi. Web sunucusunun yapacağını söylediğimde biraz aceleyle konuşmuş olabilirim , ancak form verilerinizi okumak için hangi kütüphaneyi kullanırsanız kullanın sizin için ilgilenecektir.
Quentin

47

xkr.us örneklerle harika bir tartışmaya sahiptir. Özetlerini alıntılamak için:

Escape () yöntemi, sunucu tarafında boşluk olarak yorumlanan ve alanlarında boşluk bulunan formlar tarafından oluşturulan + karakterini kodlamaz. Bu eksiklik ve bu fonksiyonun ASCII olmayan karakterleri doğru şekilde işleyememesi nedeniyle, mümkün olduğunca escape () kullanmaktan kaçınmalısınız. En iyi alternatif genellikle encodeURIComponent () yöntemidir.

escape () kodlanmaz: @ * / +

EncodeURI () yönteminin kullanımı, bir URL'nin parçası olan sorgu dizesinin aksine URI'leri kodlaması açısından escape () yönteminden biraz daha uzmanlaşmıştır. URI kullanan ve kodlanmamış olarak belirli karakterlere ihtiyaç duyan herhangi bir kaynak için kullanılacak bir dizeyi kodlamanız gerektiğinde bu yöntemi kullanın. URI'ler içinde geçerli bir karakter olduğundan, bu yöntemin 'karakterini kodlamadığını unutmayın.

encodeURI () kodlamaz: ~! @ # $ & * () =: /,;? + '

Son olarak, çoğu durumda bir URI'nin tek bir bileşenini kodlarken encodeURIComponent () yöntemi kullanılmalıdır. Bu yöntem, normalde URI'ler için özel karakter olarak tanınacak belirli karakterleri kodlayacaktır, böylece birçok bileşen dahil edilebilir. URI'ler içinde geçerli bir karakter olduğundan, bu yöntemin 'karakterini kodlamadığını unutmayın.

encodeURIComponent () kodlamaz: ~! * () '


Son zamanlarda öğrendim. TOMCAT 9 sunucuları, URL'ye neler gönderebileceğiniz konusunda daha belirgindir. encodeURIComponent (), kodlamanız gereken şeylerde "boşluk" bulunduğunuz durumlarda daha iyi çalışıyor gibi görünüyor. Tomcat 8 umursamadı ama 9 çok daha özel.
Aggie Jon, 87

Bir başka deyişle, encodeURIbir dosya #
adını

17

İşte bir özet.

  1. escape () @ * _ + - kodlamasını yapmaz. /

    Bunu kullanma.

  2. encodeURI (), AZ az 0-9'u kodlamaz; , /? : @ & = + $ - _. ! ~ * '() #

    Girişiniz ' https://searchexample.com/search?q=wiki ' gibi tam bir URL olduğunda kullanın

  3. encodeURIComponent (), AZ az 0-9 - _ kodlamaz. ! ~ * '() Girişiniz tam bir URL'nin parçası olduğunda kullanın, ör. const queryStr = encodeURIComponent(someString)

1
Bu mükemmel bir cevap çünkü tam olarak ne yaptıklarını anlatıyor. Yine de hangisini ve ne zaman kullanmam gerektiği konusunda bir sorum var. URI bileşenim tam bir URL ise ne olur? Daha sonra Kural 2 veya Kural 3'ü yukarıdan mı kullanmalıyım yoksa encodeURIComponent (encodeURI (theCompleteURI)) gibi BOTH
Panu Logic

10

encodeURIComponent (): bağımsız değişkeninin bir URI'nin bir parçası (protokol, ana bilgisayar adı, yol veya sorgu dizesi gibi) olduğunu varsayar. Bu nedenle, bir URI'nin bölümlerini ayırmak için kullanılan noktalama işaretlerinden kaçar.

encodeURI (): mevcut URL'yi kodlamak için kullanılır


7

Fark arasında encodeURIve encodeURIComponent:

encodeURIComponent(value)temel olarak queryString parametre değerlerini kodlamak için kullanılır ve içindeki tüm karakterleri kodlar value. encodeURIprotokol önekini ( http://) ve etki alanı adını yoksayar .


Çok, çok nadir durumlarda, ek karakterleri kodlamak için manuel kodlama uygulamak istediğinizde (tipik durumlarda kodlanması gerekmese de) ! *:

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

( kaynak )


6
URL'deki bu karakterlerden kaçmamalısınız.
Arashsoft

Belirtilen belgelerin dediği gibi: "bu karakterlerin resmi URI sınırlayıcı kullanımları yoktur"
caesarsol

@caesarsol bu yüzden cevabımı düzenlemeliyim. düşüncelerinizi bana bildirin çünkü alıntı yapılan belgelerin ne anlama geldiğini anlayamıyorum ..
T.Todua

normal URL kodlama kullanım durumlarından bir şey yapmazsanız, bu karakterleri kodlamak işe yaramaz :)
caesarsol

2

Diğer cevaplar amaçları açıklar. Her işlevin gerçekte dönüştüreceği karakterler şunlardır :

control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
        + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
                                                                    + '\x7F'
encodeURI         (control + ' "%<>[\\]^`{|}'                             )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@'        )
escape            (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

Yukarıdaki tüm karakterler yüzde onaltılık kodlara dönüştürülür. Boşluk %20, yüzde %25, vb. Aşağıdaki karakterler değişmeden geçer.

İşlevlerin dönüştürmeyeceği karakterler şunlardır :

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru +                      "!'()~")
escape            (pass_thru +              '+/@'          )

-4

Genel bir kural olarak kullanın encodeURIComponent. Uzun adın kullanımında daha spesifik olduğunu düşünmekten korkmayın, bana göre daha yaygın olarak kullanılan yöntemdir. Ayrıca encodeURI kullanmak için emilmeyin, çünkü onu test ettiniz ve düzgün bir şekilde kodladığı görülüyor, muhtemelen kullanmak istediğiniz şey değil ve ilk ad alanında "Fred" kullanarak basit testiniz işe yarasa da, daha sonra bir "ve" işareti eklemek gibi daha gelişmiş bir metin kullandığınızda başarısız olur. Bunun nedenleri için diğer cevaplara bakabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.