কোনও ইউআরএল স্কিম / হোস্ট / পাথের কোনও `+` কোনও স্থানকে উপস্থাপন করে?


224

আমি অবগত যে +একটি URL এর ক্যোয়ারী স্ট্রিংয়ের মধ্যে একটি স্থানকে উপস্থাপন করে। এটি কি ক্যোরিয় স্ট্রিং অঞ্চলের বাইরেও? এটি বলতে গেলে, নিম্নলিখিত ইউআরএলটি করে:

http://a.com/a+b/c

প্রকৃতপক্ষে প্রতিনিধিত্ব করুন:

http://a.com/a b/c

(এবং এটি প্রকৃতপক্ষে যদি একটি হওয়া উচিত তবে এনকোডিং করা দরকার +), বা এটি বাস্তবে উপস্থাপন করে a+b/c?



4
নোট করুন যে পিএইচপি urldecode একটি স্পেসে% 2b (এনকোডড +) ডিকোড করে। এই ব্যবহার এড়াতে rawurldecode। আমি এখানে রেফারেন্সের জন্য এটি বলছি কারণ এটি "পিএইচপি ইউআরএল ডিকোড বিরতি প্লাস প্রতীক" এর জন্য গুগল অনুসন্ধানে একটি উচ্চ রেটযুক্ত ফলাফল।
danielson317

উত্তর:


170
  • কোনও URL এর পাথ বিভাগে শতাংশ এনকোডিং ডিকোড করা হবে বলে আশা করা হচ্ছে, তবে but
  • +পাথ উপাদানটির যে কোনও অক্ষর অক্ষরে অক্ষরে বিবেচিত হবে।

স্পষ্ট করে বলতে: +ক্যোরি উপাদানটিতে কেবল একটি বিশেষ চরিত্র।


12
+1 দুর্ভাগ্যক্রমে, অনেক "ইউআরএল কোডার / এনকোডার" বন্য সেখানে এটি বুঝতে পারে না। উদাহরণস্বরূপ সিসল্যান্ডস / কেইন
লিওনব্লাই

11
@ স্টোবার: উদ্ধৃতি প্রয়োজন।
বুকজোর

8
@ স্টোবার কি আরএফসি কখনও বলেছিল যে ক্যোরির উপাদানটিতে অক্ষরটিকে +একটি স্থান হিসাবে ব্যাখ্যা করা হয়েছে? নাকি এটি কেবল "বন্য থেকে" একটি নিয়ম?
পেসারিয়ার

44
@ পেসারিয়র এবং @ বুকজোর: আরএফসি 1738 (2396 এবং 3986 দ্বারা সংশোধিত হিসাবে) স্কিম ( http:), কর্তৃত্ব ( //server.example.com) এবং পথ ( /myfile/mypage.htm) উপাদানটিকে সংজ্ঞায়িত করে এবং +চরিত্রটির জন্য কোনও বিশেষ অর্থ সংজ্ঞা দেয় না । এইচটিএমএল স্পেসটি ক্যোরির উপাদানটিকে মাইম টাইপ অ্যাপ্লিকেশন / x-www-form-+ urlencoded হিসাবে সংজ্ঞায়িত করেছে যা "আরএফসি 1738 এর মতো স্থানগুলি এবং অন্যান্য বিশেষ অক্ষরগুলি প্রতিস্থাপন" হিসাবে সংজ্ঞায়িত করা হয়েছে । সুতরাং এটি "বন্য থেকে" নয়, এটি একটি স্বীকৃত (নন-আরএফসি) মান থেকে from
স্টোবার

2
.NET পদ্ধতিটি Server.UrlEncodeভুল অংশে এইচটিটিপি বিধি লঙ্ঘন করে পাথ অংশে প্লাস হিসাবে ফাঁকা স্থানগুলি এনকোড করে।
সানক্যাট 2000

243

আপনি ডাব্লু 3 স্কুলগুলিতে সংশ্লিষ্ট ইউআরএল এনকোড করা অক্ষরের একটি দুর্দান্ত তালিকা পেতে পারেন ।

  • + হয়ে %2B
  • স্থান হয়ে যায় %20

18
আক্ষরিক '+' অক্ষরের জন্য কোনও URL এ পাথ উপাদানটিতে উপস্থিত হওয়া একেবারে আইনী ।
স্যাম স্টেইনসবি

4
আক্ষরিক + পেতে শেষ প্রান্তে (বা, কমপক্ষে পিএইচপি) প্রাপ্ত হতে এটি ট্রিপল এনকোড করাতে হবে:%25252B
ছাতা

11
এই উত্তরটি প্রশ্নের সাথে সম্পূর্ণ অপ্রাসঙ্গিক।
নিস এনজিস্ট্রমে

22

স্পেস অক্ষরগুলি কেবলমাত্র একটি প্রসঙ্গে "+" হিসাবে এনকোড করা যেতে পারে: অ্যাপ্লিকেশন / x-www-form-urlencoded কী-মান জোড়া।

আরএফসি -1866 (এইচটিএমএল 2.0 স্পেসিফিকেশন), অনুচ্ছেদ 8.2.1। উপপরিমাণ ১। বলেছেন: "ফর্মের ক্ষেত্রের নাম এবং মানগুলি পালানো হয়েছে: স্থান অক্ষরগুলি` + 'দ্বারা প্রতিস্থাপিত হবে, এবং তারপরে সংরক্ষিত অক্ষরগুলি পালিয়ে যাবে ")।

এখানে ইউআরএলটিতে এমন একটি স্ট্রিংয়ের উদাহরণ রয়েছে যেখানে আরএফসি-1866 এনকোডিং স্পেসকে প্লাস হিসাবে মঞ্জুরি দেয়: " http://example.com/over/there?name=foo+bar "। সুতরাং, কেবল "?" এর পরে, স্পেসগুলি প্লাস দ্বারা প্রতিস্থাপন করা যেতে পারে (অন্যান্য ক্ষেত্রে, স্পেসগুলি% 20 এ এনকোড করা উচিত)। ফর্ম ডেটা এনকোডিংয়ের এই উপায়টি পরবর্তী এইচটিএমএল স্পেসিফিকেশনেও দেওয়া হয়, উদাহরণস্বরূপ, এইচটিএমএল 4.0.০১ স্পেসিফিকেশনে অ্যাপ্লিকেশন / x-www-form-urlencoded সম্পর্কিত প্রাসঙ্গিক সন্ধান করুন ইত্যাদি।

তবে, যেহেতু প্রসঙ্গটি যথাযথভাবে নির্ধারণ করা শক্ত, তাই স্পেসগুলি কখনই "+" হিসাবে এনকোড না করা সেরা অভ্যাস। আরএফসি -3986-তে সংজ্ঞায়িত "অনারক্ষিত" ব্যতীত সমস্ত চরিত্রকে শতাংশ-এনকোড করা ভাল p এখানে একটি কোড উদাহরণ রয়েছে যা চিত্রটি বোঝায় যে কী এনকোড করা উচিত। এটি ডেল্ফি (পাস্কাল) প্রোগ্রামিং ভাষায় দেওয়া হয়েছে তবে এটি যে কোনও প্রোগ্রামারের পক্ষে ভাষা নির্বিশেষে এটি কোনও প্রোগ্রামারের পক্ষে কীভাবে কাজ করে তা বোঝা খুব সহজ:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
function UrlEncodeRfcA(const S: AnsiString): AnsiString;
const    
  HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
  c: AnsiChar;
begin
 // percent-encoding, see RFC-3986, p. 2.1
  Result := S;
  for I := Length(S) downto 1 do
  begin
    c := S[I];
    case c of
      'A' .. 'Z', 'a' .. 'z', // alpha
      '0' .. '9',             // digit
      '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
      else
        begin
          Result[I] := '%';
          Insert('00', Result, I + 1);
          Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
          Result[I + 2] := HexCharArrA[Byte(C) and $F];
        end;
    end;
  end;
end;

function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
begin
  Result := UrlEncodeRfcA(Utf8Encode(S));
end;

0

ইউআরএল ঠিক করার জন্য এনকোডিউআরআইকিউম্পোন্ট ফাংশন ব্যবহার করুন এটি ব্রাউজার এবং নোড.জেজে কাজ করে

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


> encodeURIComponent("http://a.com/a+b/c")
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'

1
এটি প্রশ্নের সমাধান করে না। এবং, নির্দিষ্ট ভাষা (জাভাস্ক্রিপ্ট) সহ ভুলভাবে ইউআরএলগুলি এনকোড করেছে - প্রসঙ্গের উপর নির্ভর করে আপনি সম্ভবত এনকোড করতে চান না যেখানে ইউআরএলটি কাজ করার জন্য আপনার বিশেষ (আক্ষরিক নয়) স্ল্যাশ (/) এবং কলোন (:) প্রয়োজন where ।
গ্রিমিও

ধন্যবাদ এটি সত্যিই আমাকে সাহায্য করেছে!
qwsd

-2

নীচে চেষ্টা করুন:

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>

2
আমি এটি খুব অদ্ভুত বলে মনে করি যে দু'জন লোক এই উত্তরটি দিয়েছিল। এটির আক্ষরিক অর্থেই প্রশ্নের কিছু নেই।
অ্যান্ড্রু বারবার

1
অন্যান্য অক্ষরগুলির জন্য কীভাবে * @ - _ +। /
রবি

1
@ অ্যান্ড্রুবার্বারকে কেন আপনি এটি অপ্রাসঙ্গিক বলে মনে করেছেন? +% 2 বি হয়
জাভা গাই

এটি escapeএতগুলি কারণে ভুল ... অবমাননাকৃত, পরিবর্তে আপনার ব্যবহার করা উচিত encodeURIবা কোয়েরি অংশের ক্ষেত্রে encodeURIComponent। এছাড়াও প্যারামিটার স্ট্রিং ডাব্লু 3 সি অনুযায়ী এনকোড করা উচিত ।
ক্রিস্টোফ

-5

আপনি সর্বদা ইউআরএল এনকোড করতে হবে।

এখানে রুবি কীভাবে আপনার ইউআরএলকে এনকোড করে:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"

8
আমি নিশ্চিত না যে এটি ঠিক। আরএফসি 2396 ( ietf.org/rfc/rfc2396.txt ) অনুসারে ইউআরআই -এর পাথ (বিভাগগুলি) কেবলমাত্র ক্যোরি উপাদান নয়, অনুকরণগুলি অক্ষর নয়। এর থেকে বোঝা যাচ্ছে যে তাদের ইউআরএল এনকোড করার দরকার নেই এবং এইভাবে কেবল ক্যোয়ারিতে পথের ফাঁকা স্থান হিসাবে ব্যাখ্যা করা উচিত নয়।
tlrobinson

3
আরএফসি 1738 প্লাসকে ফাঁকা স্থান হিসাবে বিবেচনা করে। এটি সমস্ত নির্ভর করে যা আপনার এনকোড / ডিকোড ফাংশন দ্বারা কার্যকর করা হয়। উদাহরণস্বরূপ, পিএইচপি-তে, Rawurlencode rfc অনুসরণ করে 1738 আর urlencode rfc অনুসরণ করেছে 2396.
জোনাথন ফিংল্যান্ড 8

1
দেখুন, এখন আমার কিছু অতিরিক্ত বিভ্রান্তি আছে। আপনি আমাকে উপরে যে উদাহরণ দিয়েছেন, a.com% 2Fa% 2Bb আমি যা চাই তা নয়, এটি খুব কমপক্ষে a.com/a%2Bb হবে। এটি একটি আসল ইউআরএল যার সাথে আমি ডিল করছি, কোনও ইউআরএলকে কোয়েরি স্ট্রিংয়ের প্যারামিটার হিসাবে পাস করা হচ্ছে না। একটু ব্যাকগ্রাউন্ডের জন্য যা স্পষ্ট করতে সাহায্য করতে পারে, ম্যাক ওএস এক্স ফাইন্ডার আমার কাছে ফাইল সিস্টেমের ইউআরএল ফিরিয়ে দিচ্ছে। সুতরাং আমার কাছে যদি "a? + B.txt" নামে একটি ফাইল থাকে তবে এটি "ফাইল: //a%3F+b.txt", নয় "ফাইল: //a%3F%2B.txt" এর মতো দেখতে কিছু দেয় । অনুসন্ধানকারী কি ঠিক ভুল, বা কোয়েরি স্ট্রিংটি আসলে একটি প্লাসের আগে একটি +?
ফ্রান্সিসকো রায়ান টলমাস্কি আই

2
জোনাথন: আপনি কি নিশ্চিত 1738 বলেছেন + সংরক্ষিত আছে? আমি দেখছি: নিরাপদ = "$" | "-" | "_" | "।" | "+" অরক্ষিত = আলফা | সংখ্যা | নিরাপদ | অতিরিক্ত হিসাবে পাশাপাশি: সুতরাং, শুধুমাত্র বর্ণানুক্রমিক, বিশেষ অক্ষর "$ -_। +! * '()," এবং সংরক্ষিত অক্ষরগুলি তাদের সংরক্ষিত উদ্দেশ্যে ব্যবহার করা যেতে পারে কোনও ইউআরএল-এর মধ্যে বিনা কোডে ব্যবহার করা যেতে পারে।
tlrobinson

2
"তুমি সর্বদা পালাতে পারবে" এর আরও যোগ্যতার প্রয়োজন, এবং উত্তর যাইহোক প্রশ্নের অপ্রাসঙ্গিক।
বাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.