DecodeURIComponent ve decodeURI arasındaki fark nedir?


363

JavaScript işlevleri decodeURIComponentile arasındaki fark nedir decodeURI?

Yanıtlar:


399

Bu ikisi arasındaki farkı açıklamak için encodeURIve arasındaki farkı açıklayayım encodeURIComponent.

Temel fark şudur:

  • encodeURIFonksiyonu tam URI kullanılmak üzere tasarlanmıştır.
  • encodeURIComponentFonksiyonu herhangi bir parçası olduğunu .. iyi .. URI bileşenlerde kullanmak amaçlı olduğunu ayırıcılar arasındaki yalanlar (; /: @ & = + $, #?).

Bu nedenle, encodeURIComponentbu ayırıcılar ayrıca özel karakterler değil, metin olarak kabul edildiğinden kodlanır.

Şimdi, kod çözme işlevleri arasındaki farka geri dönersek, her bir işlev, özel karakterlerin anlambilimine ve bunların işlenmesine dikkat ederek karşılık gelen kodlama karşılığı tarafından üretilen dizeleri çözer.


4
Bir başka hayati fark, unescape'in çok baytlı UTF-8 dizilerini işlememesidir, oyunda decodeURI [Bileşen] şunları yapar:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris

IMHO, bazı örnekler vermek çok yararlı olacaktır
transang

114

encodeURIComponent / decodeURIComponent (), URI parçalarındaki metin dizelerini birlikte birleştirmek ve ayırmak için neredeyse her zaman kullanmak istediğiniz çifttir.

encodeURI daha az yaygın ve yanıltıcı bir şekilde adlandırılmış: gerçekten fixBrokenURI olarak adlandırılmalıdır. Neredeyse bir URI olan bir şey alır, ancak içinde boşluklar gibi geçersiz karakterler vardır ve bunu gerçek bir URI'ye dönüştürür. Kullanıcı girişinden geçersiz URI'ları düzeltmek için geçerli bir kullanımı vardır ve ayrıca bir IRI'yi (çıplak Unicode karakterleri olan URI) düz bir URI'ye (ASCII olmayan kodlamak için% -escaped UTF-8 kullanarak) kullanmak için de kullanılabilir ).

decodeURI, birkaç özel karakter dışında decodeURIComponent ile aynı karakterlerin kodunu çözer. EnkoderiURI'nın tersi olması sağlanmıştır, ancak başlangıçta koyduğunuz gibi geri dönmek için buna güvenemezsiniz - bkz. decodeURI(encodeURI('%20 '));.

EncodeURI'nin gerçekten fixBrokenURI () olarak adlandırılması gereken yerlerde, decodeURI () eşit olarak potansiyel olarakBreakMyPreviouslyWorkingURI () olarak adlandırılabilir. Hiçbir yerde geçerli bir kullanım düşünemiyorum; önlemek.


11
decodeURI (encodeURI ('% 20')) '% 20' yi krom ve firefox'ta doğru bir şekilde veriyor, hangi tarayıcıdan / sürüme yanlış sonucu gözlemlediğinizi mi merak ediyorsunuz?
ccppjava

1
2009'da kırılmış olabilir, ancak bu arada modern tarayıcı yakalandı (tahminim).
WoodrowShigeru

68
js> s = "http://www.example.com/string with + and ? and & and spaces";
http://www.example.com/string with + and ? and & and spaces
js> encodeURI(s)
http://www.example.com/string%20with%20+%20and%20?%20and%20&%20and%20spaces
js> encodeURIComponent(s)
http%3A%2F%2Fwww.example.com%2Fstring%20with%20%2B%20and%20%3F%20and%20%26%20and%20spaces

Görünüşe göre encodeURIise, kodlayan alanları ve diğer bazı (örneğin, basılamaz) karakterleriyle "güvenli" bir URI üreten encodeURIComponentek kolon ve çizgi artı karakter kodlar ve sorgu dizeleri kullanılmak üzere tasarlanmıştır. + Ve? ve & burada özellikle önemlidir, çünkü bunlar sorgu dizelerindeki özel karakterlerdir.


30

Aynı soruyu sordum, ancak cevabı burada bulamadığım için, farkın gerçekte ne olduğunu anlamak için bazı testler yaptım. URL / URI ile ilgili olmayan bir şey için kodlamaya ihtiyacım olduğundan bunu yaptım.

  • encodeURIComponent("A") "A" döndürürse, "A" yı "% 41" olarak kodlamaz
  • decodeURIComponent("%41") "A" döndürür.
  • encodeURI("A") "A" döndürürse, "A" yı "% 41" olarak kodlamaz
  • decodeURI("%41") "A" döndürür.

-Bu, her ikisini de kodlamasalar bile alfasayısal karakterlerin kodunu çözebileceği anlamına gelir. Ancak...

  • encodeURIComponent("&") "% 26" değerini döndürür.
  • decodeURIComponent("%26") İadeler "&".
  • encodeURI("&") İadeler "&".
  • decodeURI("%26") "% 26" değerini döndürür.

EncodeURIComponent tüm karakterleri kodlamasa da, decodeURIComponent% 00 ile% 7F arasındaki herhangi bir değerin kodunu çözebilir.

Not:% 7F'nin üzerindeki bir değeri kod çözmeyi denerseniz (bir unicode değeri değilse), komut dosyanız "URI hatası" ile başarısız olur.


Not: İlk decodeURIComponent'te (n yerine m) bir yazım hatası vardır. Düzeltemiyorum, çünkü en az 6 karakteri düzenlemeliyim.
SuperNova

23

encodeURIComponent()

Girdiyi URL kodlu bir dizeye dönüştürür

encodeURI()

URL, girdiyi kodlar, ancak tam bir URL'nin verildiğini varsayar, bu nedenle protokolü (ör. Http: // ) ve ana bilgisayar adını (ör. Www.stackoverflow.com ) kodlayarak geçerli bir URL döndürür .

decodeURIComponent()ve decodeURI()yukarıdakilerin tam tersi


12

decodeURIComponent, &,?, #, vb. gibi URI özel işaretlerini deşifre eder, decodeURI yapmaz.


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.