Pertanyaan Kapan Anda seharusnya menggunakan escape daripada encodeURI / encodeURIComponent?


Saat menyandikan string kueri untuk dikirim ke server web - kapan Anda menggunakannya escape() dan kapan Anda gunakan encodeURI() atau encodeURIComponent():

Gunakan melarikan diri:

escape("% +&=");

ATAU

gunakan encodeURI () / encodeURIComponent ()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");

1283
2017-09-16 19:24


asal


Jawaban:


melarikan diri()

Jangan gunakan itu! escape() didefinisikan dalam bagian B.2.1.2 melarikan diri dan teks pengantar Annex B mengatakan:

... Semua fitur dan perilaku bahasa yang ditentukan dalam lampiran ini memiliki satu atau lebih karakteristik yang tidak diinginkan dan tanpa adanya penggunaan warisan akan dihapus dari spesifikasi ini. ...
  ... Programmer tidak boleh menggunakan atau menganggap keberadaan fitur dan perilaku ini ketika menulis kode ECMAScript baru ....

Tingkah laku:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

Karakter khusus dikodekan dengan pengecualian: @ * _ + -. /

Bentuk heksadesimal untuk karakter, yang nilai unit kodenya 0xFF atau kurang, adalah urutan keluar dua digit: %xx.

Untuk karakter dengan unit kode yang lebih besar, format empat digit %uxxxx digunakan. Ini tidak diizinkan dalam string kueri (sebagaimana didefinisikan dalam RFC3986):

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Tanda persen hanya diperbolehkan jika langsung diikuti oleh dua hexdigits, persen diikuti oleh u tidak diizinkan.

encodeURI ()

Gunakan encodeURI saat Anda menginginkan URL yang berfungsi. Jadikan panggilan ini:

encodeURI("http://www.example.org/a file with spaces.html")

mendapatkan:

http://www.example.org/a%20file%20with%20spaces.html

Jangan panggil encodeURIComponent karena akan menghancurkan URL dan kembali

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent ()

Gunakan encodeURIComponent saat Anda ingin menyandikan nilai parameter URL.

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

Maka Anda dapat membuat URL yang Anda butuhkan:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

Dan Anda akan mendapatkan URL lengkap ini:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

Perhatikan bahwa encodeURIComponent tidak lolos ' karakter. Bug umum adalah menggunakannya untuk membuat atribut html seperti href='MyUrl', yang bisa menderita bug injeksi. Jika Anda membangun html dari string, baik gunakan " dari pada ' untuk kutipan atribut, atau tambahkan lapisan tambahan penyandian (' dapat dikodekan sebagai% 27).

Untuk informasi lebih lanjut tentang jenis pengkodean ini Anda dapat memeriksa: http://en.wikipedia.org/wiki/Percent-encoding


1813
2018-05-24 06:54



Perbedaan antara encodeURI() dan encodeURIComponent() tepat 11 karakter dikodekan oleh encodeURIComponent tetapi tidak dengan encodeURI:

Table with the ten differences between encodeURI and encodeURIComponent

Saya menghasilkan tabel ini dengan mudah meja konsol di Google Chrome dengan kode ini:

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);


390
2017-10-09 09:26



Saya menemukan artikel ini mencerahkan: Javascript Madness: Query String Parsing

Saya menemukan itu ketika saya mencoba untuk undersand mengapa decodeURIComponent tidak decoding '+' dengan benar. Berikut ini ekstraknya:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!

43
2018-05-08 07:51



encodeURIComponent tidak menyandikan -_.!~*'(), menyebabkan masalah dalam memposting data ke php dalam string xml.

Sebagai contoh:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

Pelarian umum dengan encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

Anda dapat melihat, kutipan tunggal tidak dikodekan. Untuk mengatasi masalah saya membuat dua fungsi untuk menyelesaikan masalah dalam proyek saya, untuk Encoding URL:

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

Untuk URL Decoding:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}

37
2017-09-16 19:26



encodeURI () - fungsi escape () untuk javascript escape, bukan HTTP.


36
2017-10-08 15:20



Tabel perbandingan kecil Java vs. JavaScript vs. PHP.

1. Java URLEncoder.encode (using UTF8 charset)
2. JavaScript encodeURIComponent
3. JavaScript escape
4. PHP urlencode
5. PHP rawurlencode

char   JAVA JavaScript --PHP---
[ ]     +    %20  %20  +    %20
[!]     %21  !    %21  %21  %21
[*]     *    *    *    %2A  %2A
[']     %27  '    %27  %27  %27 
[(]     %28  (    %28  %28  %28
[)]     %29  )    %29  %29  %29
[;]     %3B  %3B  %3B  %3B  %3B
[:]     %3A  %3A  %3A  %3A  %3A
[@]     %40  %40  @    %40  %40
[&]     %26  %26  %26  %26  %26
[=]     %3D  %3D  %3D  %3D  %3D
[+]     %2B  %2B  +    %2B  %2B
[$]     %24  %24  %24  %24  %24
[,]     %2C  %2C  %2C  %2C  %2C
[/]     %2F  %2F  /    %2F  %2F
[?]     %3F  %3F  %3F  %3F  %3F
[#]     %23  %23  %23  %23  %23
[[]     %5B  %5B  %5B  %5B  %5B
[]]     %5D  %5D  %5D  %5D  %5D
----------------------------------------
[~]     %7E  ~    %7E  %7E  ~
[-]     -    -    -    -    -
[_]     _    _    _    _    _
[%]     %25  %25  %25  %25  %25
[\]     %5C  %5C  %5C  %5C  %5C
----------------------------------------
char  -JAVA-  --JavaScript--  -----PHP------
[ä]   %C3%A4  %C3%A4  %E4     %C3%A4  %C3%A4
[ф]   %D1%84  %D1%84  %u0444  %D1%84  %D1%84

14
2017-09-16 19:40



Juga ingat bahwa mereka semua menyandikan set karakter yang berbeda, dan pilih yang Anda butuhkan dengan tepat. encodeURI () mengkodekan karakter yang lebih sedikit daripada encodeURIComponent (), yang menyandikan lebih sedikit (dan juga berbeda, ke dannyp's point) karakter daripada escape ().


10
2018-04-23 16:54