javascript - আপনি যখন encodeURI/এনকোডুরিকোমোয়েনেন্ট পরিবর্তে পালানোর ব্যবহার করতে অনুমিত হয়?




encoding query-string (9)

কোনও ওয়েব সার্ভারে পাঠানোর জন্য কোনও ক্যোয়ারী স্ট্রিং এনকোড করার সময় - কখন আপনি escape() ব্যবহার করেন এবং কখন আপনি encodeURI() বা encodeURIComponent() ব্যবহার করেন encodeURI()

পালাবার ব্যবহার করুন:

escape("% +&=");

অথবা

এনকোডুআরআই () / এনকোডুরিকোমোয়েন্টেন্ট ব্যবহার করুন ()

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

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

অব্যাহতি ()

এটা ব্যবহার করবেন না! escape() অধ্যায় বি .২.1.2 এফেক্টে সংজ্ঞায়িত এবং আনক্স বি এর ভূমিকা পাঠ্যটি বলে:

... এই সংযোজনে উল্লেখিত সমস্ত ভাষা বৈশিষ্ট্য এবং আচরণগুলির এক বা একাধিক অবাঞ্ছিত বৈশিষ্ট্য রয়েছে এবং লিগ্যাসি ব্যবহারের অভাবে এই স্পেসিফিকেশন থেকে সরানো হবে। ...
... নতুন ECMAScript কোড লেখার সময় প্রোগ্রামাররা এই বৈশিষ্ট্যগুলি এবং আচরণগুলির অস্তিত্ব ব্যবহার বা অনুমান করা উচিত নয় ....

আচরণ:

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

বিশেষ অক্ষর ব্যতিক্রম ছাড়া এনকোড করা হয়: @ * _ + -। /

অক্ষরের জন্য হেক্সাডেসিমাল ফর্ম, যার কোড ইউনিট মান 0xFF বা তার কম, একটি দুই-সংখ্যা পাল্টা ক্রম: %xx

বৃহত্তর কোড ইউনিটের অক্ষরগুলির জন্য, চার-সংখ্যার বিন্যাস %uxxxx ব্যবহার করা হয়। এটি একটি ক্যোয়ারী স্ট্রিংয়ের মধ্যে অনুমোদিত নয় (যেমন RFC3986 সংজ্ঞায়িত):

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

একটি শতাংশ সাইন শুধুমাত্র অনুমোদিত হলে এটি হেক্সাডিজিট দ্বারা সরাসরি অনুসরণ করা হয়, তারপরে আপনার অনুসরণ করা শতাংশ অনুমোদিত নয়।

encodeURI ()

যখন আপনি একটি কার্যকর URL টি চান তখন এনকোডুরিটি ব্যবহার করুন। এই কল করুন:

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

পেতে:

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

এটি ইউআরএল ধ্বংস এবং ফেরত হবে, কারণ এনকোডুডিওমিকম্পনেট কল করবেন না

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

encodeURIComponent ()

আপনি যখন একটি ইউআরএল প্যারামিটারের মান এনকোড করতে চান তখন এনকোডোরিকোম্পয়েন্টেন্ট ব্যবহার করুন।

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

তারপরে আপনার প্রয়োজনীয় URL তৈরি করতে পারেন:

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

এবং আপনি এই সম্পূর্ণ URL পাবেন:

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

উল্লেখ্য যে এনকোডোরিকোম্পেন্টেন্ট ' চরিত্র থেকে পালাতে পারে না। এইচটিএমএল href='MyUrl' যেমন এইচটিএমএল বৈশিষ্ট্যগুলি তৈরি করতে এটি ব্যবহার করা একটি সাধারণ বাগ, যা একটি ইনজেকশন বাগ ভোগ করতে পারে। আপনি যদি স্ট্রিং থেকে এইচটিএমএল গঠন করেন তবে উদ্ধৃতি চিহ্নের জন্য " পরিবর্তে " ব্যবহার করুন, অথবা এনকোডিংয়ের অতিরিক্ত স্তর যোগ করুন ( ' % 27 হিসাবে এনকোড করা যেতে পারে)।

এই ধরনের এনকোডিং সম্পর্কে আরও তথ্যের জন্য আপনি এটি পরীক্ষা করতে পারেন: http://en.wikipedia.org/wiki/Percent-encoding এনকোডিং


@ জোহান-ইচভরিয়ার উত্তরটির আধুনিক পুনর্বিবেচনা:

console.log(
    Array(256)
        .fill()
        .map((ignore, i) => String.fromCharCode(i))
        .filter(
            (char) =>
                encodeURI(char) !== encodeURIComponent(char)
                    ? {
                          character: char,
                          encodeURI: encodeURI(char),
                          encodeURIComponent: encodeURIComponent(char)
                      }
                    : false
        )
)

অথবা আপনি যদি একটি টেবিল ব্যবহার করতে পারেন, console.log console.table console.log সহ (Prettier আউটপুট জন্য) প্রতিস্থাপন করুন।


আমার এই ফাংশন আছে ...

var escapeURIparam = function(url) {
    if (encodeURIComponent) url = encodeURIComponent(url);
    else if (encodeURI) url = encodeURI(url);
    else url = escape(url);
    url = url.replace(/\+/g, '%2B'); // Force the replacement of "+"
    return url;
};

আমি এই নিবন্ধটি আলোকিত খুঁজে পেয়েছি: জাভাস্ক্রিপ্ট ম্যাডনেস: প্রশ্ন স্ট্রিং পার্সিং

ডিস্কোডাইকোমেন্টেন্ট সঠিকভাবে '+' ডিকোডিং না করায় কেন আমি এটি নিম্নরূপ অনুসন্ধান করার চেষ্টা করছিলাম। এখানে একটি নির্যাস হয়:

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!

আমি যেমন পদ্ধতি এক ব্যবহার না করার সুপারিশ। সঠিক কাজ করে যা আপনার নিজস্ব ফাংশন লিখুন।

এমডিএন নীচের দেখানো ইউআরএল এনকোডিং উপর একটি ভাল উদাহরণ দিয়েছেন।

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName);

console.log(header); 
// logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"


function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            //  so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

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


এছাড়াও মনে রাখবেন যে তারা সবাই অক্ষরের বিভিন্ন সেট এনকোড করে এবং আপনার যথাযথভাবে প্রয়োজন এমন একটি নির্বাচন করুন। এনকোডুআরআই () এনকোডুরিকোমোয়েনেন্ট () এর চেয়ে কম অক্ষরকে এনকোড করে, যা পাল্টা () থেকে কম (এবং ড্যানিপি এর বিন্দুতেও ভিন্ন) এনকোড করে।


গ্রহণযোগ্য উত্তর ভাল। শেষ অংশে প্রসারিত করার জন্য:

উল্লেখ্য যে এনকোডোরিকোম্পেন্টেন্ট 'চরিত্র থেকে পালাতে পারে না। এইচটিএমএল = 'মাই ইউআরএল' যেমন এইচটিএমএল বৈশিষ্ট্যগুলি তৈরি করতে এটি ব্যবহার করা একটি সাধারণ বাগ, যা একটি ইনজেকশন বাগ ভোগ করতে পারে। আপনি যদি স্ট্রিং থেকে এইচটিএমএল গঠন করেন তবে উদ্ধৃতি চিহ্নের জন্য "এর পরিবর্তে" ব্যবহার করুন, অথবা এনকোডিংয়ের অতিরিক্ত স্তর যোগ করুন ('% 27 হিসাবে এনকোড করা যেতে পারে)।

আপনি নিরাপদ দিকে থাকতে চান, শতাংশ এনকোডিং অ unreserved অক্ষর এনকোড করা উচিত।

আপনি এই পদ্ধতি ব্যবহার করতে পারেন তাদের পালাতে (উৎস https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent )

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

// fixedEncodeURIComponent("'") --> "%27"

ছোট তুলনা টেবিল জাভা বনাম জাভাস্ক্রিপ্ট বনাম পিএইচপি।

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

encodeURI() এবং encodeURIComponent() এর মধ্যে পার্থক্য encodeURI() দ্বারা এনকোড করা ঠিক 11 টি অক্ষর কিন্তু এনকোডুরি দ্বারা নয়:

আমি এই কোডটি দিয়ে কনসোল টাইটেলের মাধ্যমে সহজেই এই টেবিলটি তৈরি করেছি:

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);





query-string