Haruskah saya menggunakan komponen encodeURI atau encodeURIC untuk pengkodean URL?

282

Manakah dari dua metode ini yang harus digunakan untuk menyandikan URL?

Aditya Shukla
sumber
3
Juga lihat stackoverflow.com/a/3608791/632951
Pacerier
13
Satu perbedaan utama adalah bahwa encodeURItidak akan menyandikan /jadi: encodeURIComponent("ac/dc")=> ac%2Fdcdan encodeURI("ac/dc")=>ac/dc
Ini mungkin membantu: "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." Sumber
user1063287
Juga lihat bagian spesifik berjudul encodeURIComponent differs from encodeURI as followsdi: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user1063287

Jawaban:

324

Itu tergantung pada apa yang sebenarnya ingin Anda lakukan.

encodeURI mengasumsikan bahwa input adalah URI lengkap yang mungkin memiliki beberapa karakter yang perlu dikodekan di dalamnya.

encodeURIComponent akan menyandikan semuanya dengan makna khusus, jadi Anda menggunakannya untuk komponen URI seperti

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

Jika Anda menyandikan string untuk dimasukkan ke dalam komponen URL (parameter querystring), Anda harus menelepon encodeURIComponent.

Jika Anda menyandikan URL yang ada, hubungi encodeURI.

Slaks
sumber
1
Jika saya menggunakan ajax bagaimana cara mendekode url yang diteruskan ke php?
Aditya Shukla
6
Kamu tidak. Server web melakukan itu secara otomatis.
Quentin
@Aditya: Tergantung apa yang Anda lakukan.
SLaks
@slaks. Saya mengirimkan parameter melalui get jadi saya ingin mengambilnya di php.
Aditya Shukla
2
Baik. Saya mungkin telah berbicara sedikit dengan tergesa-gesa ketika saya mengatakan server web akan melakukannya, tetapi perpustakaan apa pun yang Anda gunakan untuk membaca data formulir Anda akan mengurusnya untuk Anda.
Quentin
47

xkr.us memiliki diskusi yang hebat, dengan contoh-contoh. Mengutip ringkasan mereka:

Metode escape () tidak menyandikan karakter + yang diartikan sebagai ruang di sisi server serta dihasilkan oleh formulir dengan spasi di bidangnya. Karena kekurangan ini dan fakta bahwa fungsi ini gagal menangani karakter non-ASCII dengan benar, Anda harus menghindari penggunaan escape () bila memungkinkan. Alternatif terbaik biasanya encodeURIComponent ().

escape () tidak akan menyandikan: @ * / +

Penggunaan metode encodeURI () sedikit lebih khusus daripada escape () karena ia mengkodekan untuk URI yang bertentangan dengan querystring, yang merupakan bagian dari URL. Gunakan metode ini ketika Anda harus menyandikan string yang akan digunakan untuk sumber daya apa pun yang menggunakan URI dan membutuhkan karakter tertentu untuk tetap tidak dikodekan. Perhatikan bahwa metode ini tidak menyandikan karakter, karena merupakan karakter yang valid di dalam URI.

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

Terakhir, metode encodeURIComponent () harus digunakan dalam banyak kasus ketika pengkodean komponen tunggal URI. Metode ini akan menyandikan karakter tertentu yang biasanya dikenali sebagai karakter khusus untuk URI sehingga banyak komponen dapat dimasukkan. Perhatikan bahwa metode ini tidak menyandikan karakter, karena merupakan karakter yang valid di dalam URI.

encodeURIComponent () tidak akan menyandikan: ~! * () '

BrianFreud
sumber
Baru-baru ini dipelajari. Server TOMCAT 9 lebih khusus tentang apa yang dapat Anda kirim ke URL. encodeURIComponent () tampaknya berfungsi lebih baik dalam kasus di mana Anda memiliki "spasi" dalam apa yang perlu Anda encode. Tomcat 8 tidak peduli tetapi 9 lebih khusus.
Aggie Jon dari 87
Jadi dengan kata lain encodeURIgagal jika Anda mencoba mengonversi nama file ke URL dan nama file ada #di dalamnya
gman
17

Berikut ini ringkasannya.

  1. escape () tidak akan menyandikan @ * _ + -. /

    Jangan gunakan itu.

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

    Gunakan ketika input Anda adalah URL lengkap seperti ' https://searchexample.com/search?q=wiki '

  3. encodeURIComponent () tidak akan menyandikan AZ az 0-9 - _. ! ~ * '() Gunakan ketika input Anda adalah bagian dari URL lengkap mis const queryStr = encodeURIComponent(someString)
Frank Wang
sumber
1
Ini adalah jawaban yang sangat baik karena memberi tahu persis apa yang mereka lakukan. Namun saya masih memiliki pertanyaan tentang yang harus saya gunakan dan kapan. Bagaimana jika komponen URI saya adalah URL yang lengkap? Haruskah saya menggunakan Aturan 2 atau Aturan 3 dari atas ATAU mungkin KEDUA seperti encodeURICon (encodeURI (theCompleteURI))
Panu Logic
10

encodeURIComponent (): mengasumsikan bahwa argumennya adalah sebagian (seperti protokol, nama host, jalur, atau string kueri) dari URI. Karenanya ia lolos dari karakter tanda baca yang digunakan untuk memisahkan bagian-bagian dari URI.

encodeURI (): digunakan untuk menyandikan url yang ada

Gopal
sumber
7

Perbedaan antara encodeURIdan encodeURIComponent:

encodeURIComponent(value)terutama digunakan untuk menyandikan nilai parameter queryString, dan itu mengkodekan setiap karakter yang berlaku di value. encodeURImengabaikan awalan protokol ( http://) dan nama domain.


Dalam kasus yang sangat, sangat jarang, ketika Anda ingin menerapkan pengkodean manual untuk menyandikan karakter tambahan (meskipun mereka tidak perlu dikodekan dalam kasus-kasus tertentu) seperti:, ! *maka Anda dapat menggunakan:

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

( sumber )

T.Todua
sumber
6
Anda tidak harus melarikan diri dari charachters di url
Arashsoft
Seperti yang disebutkan dalam dokumentasi yang dikutip: "karakter ini tidak memiliki penggunaan pembatas URI yang diformalkan"
caesarsol
@ caesarsol jadi, haruskah saya mengedit jawaban saya. biarkan aku tahu apa yang kamu pikirkan karena aku tidak mengerti apa arti dokumentasi yang dikutip itu ..
T.Todua
tidak ada gunanya untuk menyandikan karakter ini, kecuali jika Anda melakukan sesuatu dari kasus penggunaan penyandian URL yang normal :)
caesarsol
2

Jawaban lain menjelaskan tujuan. Berikut adalah karakter yang akan dikonversi oleh setiap fungsi :

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 + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

Semua karakter di atas dikonversi ke kode persen-heksadesimal. Spasi ke %20, persen ke %25, dll. Karakter di bawah melewati tidak berubah.

Berikut adalah karakter-karakter yang fungsi-fungsi TIDAK akan dikonversi :

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

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

Sebagai aturan umum digunakan encodeURIComponent. Jangan takut nama panjang berpikir itu lebih spesifik dalam penggunaannya, bagi saya itu metode yang lebih umum digunakan. Juga jangan terseret ke dalam menggunakan encodeURI karena Anda mengujinya dan tampaknya menjadi pengkodean dengan benar, itu mungkin bukan apa yang Anda maksudkan untuk digunakan dan meskipun tes sederhana Anda menggunakan "Fred" dalam bidang nama pertama berhasil, Anda akan menemukan nanti ketika Anda menggunakan teks yang lebih canggih seperti menambahkan ampersand atau tagar itu akan gagal. Anda dapat melihat jawaban lain untuk alasan mengapa ini.

Helzgate
sumber