Apa perbedaan antara komponen decodeURIC dan decodeURI?


363

Apa perbedaan antara fungsi JavaScript decodeURIComponentdan decodeURI?

Jawaban:


398

Untuk menjelaskan perbedaan antara keduanya, izinkan saya menjelaskan perbedaan antara encodeURIdan encodeURIComponent.

Perbedaan utamanya adalah:

  • The encodeURIFungsi ini dimaksudkan untuk digunakan pada URI penuh.
  • The encodeURIComponentFungsi ini dimaksudkan untuk digunakan pada .. baik .. komponen URI yang merupakan bagian setiap yang terletak antara pemisah (; /: @ & = + $, #?).

Jadi, dalam encodeURIComponentpemisah ini dikodekan juga karena mereka dianggap sebagai teks dan bukan karakter khusus.

Sekarang kembali ke perbedaan antara fungsi-fungsi decode, masing-masing fungsi mendekode string yang dihasilkan oleh mitra penyandian yang sesuai untuk menjaga semantik karakter khusus dan penanganannya.


4
Perbedaan vital lainnya adalah bahwa unescape tidak menangani urutan multi-byte UTF-8 sedangkan decodeURI [Komponen] tidak:decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";
chris

IMHO, memberikan beberapa contoh akan sangat berguna
transang

114

encodeURIComponent / decodeURICon component () hampir selalu merupakan pasangan yang ingin Anda gunakan, untuk menyatukan dan memisahkan string teks di bagian URI.

encodeURI kurang umum, dan diberi nama yang menyesatkan: itu harus benar-benar disebut fixBrokenURI. Dibutuhkan sesuatu yang hampir seperti URI, tetapi memiliki karakter yang tidak valid seperti spasi di dalamnya, dan mengubahnya menjadi URI nyata. Ini memiliki penggunaan yang valid dalam memperbaiki URI yang tidak valid dari input pengguna, dan juga dapat digunakan untuk mengubah IRI (URI dengan karakter Unicode telanjang) menjadi URI biasa (menggunakan% -escaped UTF-8 untuk mengkodekan non-ASCII ).

decodeURI menerjemahkan karakter yang sama dengan komponen decodeURIC kecuali untuk beberapa karakter khusus. Ini disediakan untuk menjadi kebalikan dari encodeURI, tetapi Anda masih tidak dapat mengandalkannya untuk mengembalikan yang sama seperti yang Anda masukkan - lihat misalnya. decodeURI(encodeURI('%20 '));.

Di mana encodeURI harus benar-benar dinamai fixBrokenURI (), decodeURI () juga bisa disebut berpotensiBreakMyPreviouslyWorkingURI (). Saya tidak bisa memikirkan penggunaan yang valid untuk itu di mana pun; menghindari.


11
decodeURI (encodeURI ('% 20')) memberikan '% 20' dengan benar yaitu, chrome dan firefox, hanya ingin tahu dari browser / versi mana hasil yang salah Anda amati?
ccppjava

1
Mungkin sudah rusak pada tahun 2009 tetapi browser modern terjebak sementara (dugaan saya).
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

Sepertinya encodeURImenghasilkan URI "aman" dengan menyandikan spasi dan beberapa karakter lain (mis. Tidak dapat dicetak), sedangkan encodeURIComponentselain itu menyandikan karakter titik dua dan tanda kutip dan plus, dan dimaksudkan untuk digunakan dalam string kueri. Pengkodean + dan? dan & sangat penting di sini, karena ini adalah karakter khusus dalam string kueri.


30

Karena saya memiliki pertanyaan yang sama, tetapi tidak menemukan jawabannya di sini, saya melakukan beberapa tes untuk mengetahui apa perbedaan sebenarnya. Saya melakukan ini, karena saya perlu pengkodean untuk sesuatu, yang tidak terkait URL / URI.

  • encodeURIComponent("A") mengembalikan "A", itu tidak menyandikan "A" ke "% 41"
  • decodeURIComponent("%41") mengembalikan "A".
  • encodeURI("A") mengembalikan "A", itu tidak menyandikan "A" ke "% 41"
  • decodeURI("%41") mengembalikan "A".

-Itu artinya keduanya dapat mendekode karakter alfanumerik, meskipun mereka tidak mengkodekannya. Namun...

  • encodeURIComponent("&") mengembalikan "% 26".
  • decodeURIComponent("%26") mengembalikan "&".
  • encodeURI("&") mengembalikan "&".
  • decodeURI("%26") mengembalikan "% 26".

Meskipun komponen encodeURIC tidak mengkodekan semua karakter, komponen decodeURIC dapat mendekodekan nilai apa pun antara% 00 dan% 7F.

Catatan: Tampaknya jika Anda mencoba mendekode nilai di atas% 7F (kecuali itu nilai unicode), maka skrip Anda akan gagal dengan "kesalahan URI".


Catatan: Ada kesalahan ketik pada komponen decodeURICon pertama (m bukan n). Saya tidak dapat memperbaikinya, karena saya harus mengedit setidaknya 6 karakter.
SuperNova

23

encodeURIComponent()

Mengubah input menjadi string yang dikodekan URL

encodeURI()

URL-menyandikan input, tetapi mengasumsikan URL lengkap diberikan, jadi kembalikan URL yang valid dengan tidak menyandikan protokol (misalnya http: // ) dan nama host (mis. Www.stackoverflow.com ).

decodeURIComponent()dan decodeURI()kebalikan dari hal di atas


12

decodeURICon komponen akan men-decode penanda khusus URI seperti &,?, #, dll. decodeURI tidak akan.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.