Pertanyaan Mengapa encodeURIComponent tidak mengenkode tanda kutip tunggal / apostrof?


Itu melarikan diri() fungsi, sudah ditinggalkan dan diganti oleh encodeURIComponent tapi encodeURIComponent tidak mengenkode karakter kutipan / apostrop tunggal. Yang saya butuhkan untuk melarikan diri dari apostrophes dalam nama orang (Misalnya 'O'Neill') dalam bentuk AJAX. Mengapa mereka menghilangkan kemampuan dari sesuatu yang mereka coba tingkatkan?

EDIT:

Jadi di sini adalah contoh kode untuk menjelaskan masalah lebih teliti. Jadi seperti yang Anda lihat nama keluarga 'O'Neill' mengandung tanda kutip yang harus diloloskan saat meneruskan variabel dalam url. Tetapi ini juga akan terjadi di tempat lain dalam bentuk, misalnya jika alamat yang dimasukkan adalah 'Billy's Tavern'.

<input id='surname' value="O'Neill">                        
<script>
var get_url = '?surname='+encodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

Solusi saya saat ini, menggunakan fungsi kustom. Pertanyaan saya hanya bertanya mengapa ada kebutuhan untuk fungsi kustom.

<script>
function customEncodeURIComponent(URI) {
    return encodeURIComponent(URI).replace(/'/g, "%27");
}
</script>

<input id='surname' value="O'Neill">
<script>
var get_url = '?surname='+customEncodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

32
2017-08-15 11:04


asal


Jawaban:


encodeURIComponent keluar semua karakter kecuali yang berikut:

abjad, digit desimal, - _. ! ~ * '()

Jika Anda ingin menggunakan pengkodean yang kompatibel dengan RFC 3986 (yang cadangan !, ', (, ), dan *), Kamu dapat memakai:

function rfc3986EncodeURIComponent (str) {  
    return encodeURIComponent(str).replace(/[!'()*]/g, escape);  
}

Anda dapat memperoleh informasi lebih lanjut tentang ini di MDN.

MEMPERBARUI:

Untuk menjawab pertanyaan Anda, mengapa ' dan karakter lain yang disebutkan di atas tidak dikodekan oleh encodeURIComponent, jawaban singkatnya adalah bahwa mereka hanya perlu dikodekan dalam skema URI tertentu dan keputusan untuk menyandikannya tergantung pada skema yang Anda gunakan.

Kutipan RFC 3986:

Aplikasi penghasil URI harus persen-encode data oktet itu   sesuai dengan karakter dalam reserved set kecuali karakter-karakter ini   secara khusus diizinkan oleh skema URI untuk mewakili data dalam hal itu   komponen. Jika karakter cadangan ditemukan dalam komponen URI dan tidak ada   peran delimiting dikenal untuk karakter itu, maka itu harus   ditafsirkan sebagai mewakili oktet data yang sesuai dengan itu   pengkodean karakter dalam US-ASCII.

Di mana "set reserved" didefinisikan sebagai

reserved    = gen-delims / sub-delims
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="

Apostrophe ada di dalam sub-delims kelompok. Dengan kata lain, Anda harus membiarkan karakter-karakter ini tidak terkecuali terutama jika Anda yakin bahwa mengkonsumsi aplikasi akan tahu apa yang harus dilakukan dengan mereka: misalnya jika Anda salah dikodekan ? dan & mereka tidak akan lagi membatasi bagian permintaan. Secara historis ada juga proposal untuk parameter segmen jalur yang dibatasi dengan ; dan , (tidak mendapat adopsi besar), jadi karakter ini juga masih diperbolehkan. Bukan itu apostrohe adalah "bebas untuk menggunakan" (yaitu unreserved) dalam data URI, tetapi diasumsikan akan memiliki beberapa arti khusus dalam konteks URI, misalnya segment bagian:

segment       = *pchar
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

40
2017-08-15 11:26



coba ini

encodeURIComponent(str).replace(/'/g, "%27");

Itu /char/g syntax memberitahu JavaScript untuk mengganti semua kemunculan dalam string Anda


4
2017-08-15 11:08



Saya melihat ada masalah yang sama dengan karakternya: " dan \ jadi itulah yang berhasil untuk saya:

var replaceChars={ '\\':'\\\\' , '"':'\\"' };
encodeURIComponent(str.replace(/\\|"/gi, function(matched){
    return replaceChars[matched];
})),

0
2018-01-28 08:29



ini membantu saya:

replace(/'/g, '%60')

% 60 adalah `, tetapi entah bagaimana didefinisikan sebagai kutipan tunggal.


-1
2017-12-24 22:03