Apa perbedaan antara fungsi JavaScript decodeURIComponent
dan decodeURI
?
Apa perbedaan antara fungsi JavaScript decodeURIComponent
dan decodeURI
?
Jawaban:
Untuk menjelaskan perbedaan antara keduanya, izinkan saya menjelaskan perbedaan antara encodeURI
dan encodeURIComponent
.
Perbedaan utamanya adalah:
encodeURI
Fungsi ini dimaksudkan untuk digunakan pada URI penuh.encodeURIComponent
Fungsi ini dimaksudkan untuk digunakan pada .. baik .. komponen URI yang merupakan bagian setiap yang terletak antara pemisah (; /: @ & = + $, #?).Jadi, dalam encodeURIComponent
pemisah 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.
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.
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 encodeURI
menghasilkan URI "aman" dengan menyandikan spasi dan beberapa karakter lain (mis. Tidak dapat dicetak), sedangkan encodeURIComponent
selain 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.
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".
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
komponen encodeURIC Tidak Lolos:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
encodeURI () Tidak Lolos:
A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
decodeURIComponent("%C3%A9") == "é"; unescape("%C3%A9") == "é";