যদি কেবল ইউআরএল এনকোডিংয়ের জন্যই ডিল হয় তবে আমার এস্কেপউরিস্ট্রিং ব্যবহার করা উচিত ?
যদি কেবল ইউআরএল এনকোডিংয়ের জন্যই ডিল হয় তবে আমার এস্কেপউরিস্ট্রিং ব্যবহার করা উচিত ?
উত্তর:
EscapeDataStringসর্বদা ব্যবহার করুন (কেন আরও তথ্যের জন্য, লিভভেনের উত্তর নীচে দেখুন)
সম্পাদনা : এনকোডিংয়ে কীভাবে দু'জনের মধ্যে পার্থক্য রয়েছে তার মৃত লিঙ্ক সরানো হয়েছে
URLEncodeখুব বেশি তুলনা করা) প্রকৃতপক্ষে পালিয়ে যায় (আনস্কেপগুলি নয়)।
আমি বিদ্যমান উত্তরগুলি সন্তোষজনক পাইনি তাই আমি এই সমস্যাটি নিষ্পত্তি করার জন্য আরও গভীর খননের সিদ্ধান্ত নিয়েছি। আশ্চর্যজনকভাবে, উত্তরটি খুব সহজ:
ব্যবহারের জন্য কোনও বৈধ কারণ নেই (প্রায় *) Uri.EscapeUriString। আপনার যদি কোনও স্ট্রিং শতাংশ-এনকোড করার দরকার হয় তবে সর্বদা ব্যবহার করুন Uri.EscapeDataString।
* বৈধ ব্যবহারের ক্ষেত্রে শেষ অনুচ্ছেদটি দেখুন।
কেন? ডকুমেন্টেশন অনুযায়ী :
ইউরি কনস্ট্রাক্টরের প্যারামিটার হওয়ার জন্য একটি অবিচ্ছিন্ন ইউআরআই স্ট্রিং প্রস্তুত করতে EscapeUriString পদ্ধতিটি ব্যবহার করুন।
এটি সত্যিকার অর্থে বোঝায় না। আরএফসি 2396 অনুসারে :
একটি ইউআরআই সর্বদা একটি "পালানো" ফর্মের মধ্যে থাকে, যেহেতু একটি সম্পূর্ণ ইউআরআইকে অব্যাহতি দেওয়া বা আনইস্কেপ করা তার শব্দার্থবিজ্ঞানের পরিবর্তন করতে পারে।
উদ্ধৃত আরএফসি আরএফসি 3986 দ্বারা অচল হয়ে পড়েছে , পয়েন্টটি এখনও রয়েছে। আসুন কয়েকটি কংক্রিট উদাহরণ দেখে এটি যাচাই করুন:
আপনার মত একটি সাধারণ ইউআরআই আছে:
http://example.org/
Uri.EscapeUriString এটি পরিবর্তন করবে না।
আপনি পালানোর বিষয়ে বিবেচনা না করে ম্যানুয়ালি ক্যোয়ারী স্ট্রিং সম্পাদনা করার সিদ্ধান্ত নিয়েছেন:
http://example.org/?key=two words
Uri.EscapeUriString (সঠিকভাবে) আপনার জন্য স্থান পালাতে হবে:
http://example.org/?key=two%20wordsআপনি আরও জিজ্ঞাসা স্ট্রিং ম্যানুয়ালি সম্পাদনা করার সিদ্ধান্ত নিন:
http://example.org/?parameter=father&son
যাইহোক, এই স্ট্রিংটি পরিবর্তিত হবে না Uri.EscapeUriString, কারণ এটি ধরে নিয়েছে যে এম্পারস্যান্ডটি অন্য কী-মান জুটির সূচনা করে। এটি আপনার ইচ্ছা মত বা নাও হতে পারে।
আপনি স্থির করেন যে আপনি প্রকৃতপক্ষে keyপ্যারামিটারটি চান father&son, সুতরাং আপনি অ্যাম্পারস্যান্ড থেকে বেরিয়ে পূর্ববর্তী ইউআরএলটি ম্যানুয়ালি ঠিক করুন:
http://example.org/?parameter=father%26son
তবে Uri.EscapeUriStringশতাংশের অক্ষরটিও এড়ানো যাবে, যা ডাবল এনকোডিংয়ের দিকে নিয়ে যাবে:
http://example.org/?parameter=father%2526sonআপনি দেখতে পাচ্ছেন, Uri.EscapeUriStringএর উদ্দেশ্যযুক্ত উদ্দেশ্যে ব্যবহার &করা একাধিক কী-মান জোড়ার মধ্যে বিভাজক হিসাবে পরিবর্তে কোনও ক্যোরি স্ট্রিংয়ে কোনও কী বা মানের অংশ হিসাবে ব্যবহার করা অসম্ভব করে তোলে ।
এটি কারণ, এটি সম্পূর্ণ ইউআরআইগুলি পালানোর উপযোগী করার প্রয়াসে, এটি সংরক্ষিত অক্ষরগুলিকে উপেক্ষা করে এবং কেবল অক্ষরগুলি থেকে রক্ষা পায় যেগুলি সংরক্ষিত বা অরক্ষিত নয়, যা বিটিডাব্লু ডকুমেন্টেশনের বিপরীত । এইভাবে আপনার মতো কিছু শেষ হয় না http%3A%2F%2Fexample.org%2F, তবে আপনি উপরে বর্ণিত সমস্যাগুলি শেষ করেন।
শেষ পর্যন্ত, যদি আপনার ইউআরআই বৈধ হয়, তবে এটি ইউরি কনস্ট্রাস্টারের কাছে প্যারামিটার হিসাবে পাস করার জন্য এড়াতে হবে না এবং যদি এটি বৈধ না হয় তবে কল Uri.EscapeUriStringকরা কোনও জাদু সমাধান নয়। প্রকৃতপক্ষে, এটি বেশিরভাগ ক্ষেত্রে না হলেও এটি অনেক ক্ষেত্রেই কাজ করবে তবে এটি কোনওভাবেই নির্ভরযোগ্য নয়।
আপনার সর্বদা আপনার ইউআরএল এবং ক্যোয়ারী স্ট্রিংগুলি কী-মান জোড় এবং শতাংশ-এনকোডিং সংগ্রহ করে এবং তারপরে প্রয়োজনীয় বিভাজকগুলির সাথে যুক্ত করে তাদের তৈরি করা উচিত। আপনি Uri.EscapeDataStringএই উদ্দেশ্যে ব্যবহার করতে পারেন , তবে তা নয় Uri.EscapeUriString, যেহেতু এটি সংরক্ষিত অক্ষরগুলি থেকে রক্ষা পায় না, যেমন উপরে বর্ণিত আছে।
কেবলমাত্র যদি আপনি এটি করতে না পারেন, উদাহরণস্বরূপ ব্যবহারকারী-সরবরাহিত ইউআরআইগুলির সাথে ডিল করার সময়, এটি Uri.EscapeUriStringকোনও সর্বশেষ অবলম্বন হিসাবে ব্যবহার করার জন্য অর্থবোধ করে না ? তবে পূর্বে উল্লিখিত সতর্কতামূলক প্রয়োগগুলি - যদি ব্যবহারকারী দ্বারা সরবরাহিত ইউআরআই দ্ব্যর্থহীন হয় তবে ফলাফলগুলি পছন্দসই হতে পারে না।
encodeURI/ Uri.EscapeUriStringযেমন প্রয়োজন হয় না প্রায়শই encodeURIComponent/ Uri.EscapeDataString(যেহেতু যখন আপনি অন্ধ URL গুলি করে একটি URI প্রেক্ষাপটে ব্যবহার করা আবশ্যক সঙ্গে deaing হয়) তার জায়গা নেই, কিন্তু যে মানে না।
প্লাস (+) অক্ষরগুলি এই পদ্ধতির মধ্যে পার্থক্য সম্পর্কে অনেক কিছুই প্রকাশ করতে পারে। একটি সাধারণ ইউআরআই-তে, প্লাস চরিত্রটির অর্থ "স্পেস"। "সুখী বিড়াল" এর জন্য গুগলকে জিজ্ঞাসা করার বিষয়টি বিবেচনা করুন:
এটি একটি বৈধ ইউআরআই (এটি চেষ্টা করুন), এবং EscapeUriStringএটি কোনও সংশোধন করবে না।
এখন গুগলকে "হ্যাপি সি ++" এর জন্য জিজ্ঞাসা করার বিষয়টি বিবেচনা করুন:
এটি একটি বৈধ ইউআরআই (এটি চেষ্টা করুন), তবে এটি "হ্যাপি সি" এর জন্য একটি অনুসন্ধান তৈরি করে, কারণ দুটি প্লাসকে স্পেস হিসাবে ব্যাখ্যা করা হয়। এটির সমাধানের জন্য, আমরা "হ্যাপি সি ++" EscapeDataStringএবং ভয়েলা * :
*) এনকোডযুক্ত ডেটা স্ট্রিংটি আসলে "হ্যাপি% 20c% 2B% 2B"; স্পেস ক্যারেক্টারের জন্য% 20 হেক্স, এবং প্লাস চরিত্রের জন্য% 2 বি হেক্স is
আপনি UriBuilderযেমনটি ব্যবহার করা উচিত তা যদি ব্যবহার করেন তবে আপনাকে কেবল EscapeDataStringআপনার পুরো ইউআরআইয়ের কিছু উপাদান সঠিকভাবে পালাতে হবে। @ লিভভেনের এই প্রশ্নের উত্তর আরও প্রমাণ করে যে ব্যবহার করার কোনও কারণ নেই EscapeUriString।
"https://www.google.com/?q=happy c++"। দেখে মনে হচ্ছে আমাকে "?" এ নিজেই বিভক্ত হওয়া দরকার, না এর থেকে আরও ভাল উপায় আছে?
EscapeDataString। আপনার প্রদত্ত URL টি যদি সত্যিকারের URL হয় তবে হ্যাঁ আপনি কেবল বিভক্ত করতে চান ?।
উত্সের মন্তব্যগুলি স্পষ্টভাবে পার্থক্যটির ঠিকানা দেয়। এক্সএমএল ডকুমেন্টেশন মন্তব্যের মাধ্যমে এই তথ্যটি কেন সামনে আনা হয়নি তা আমার কাছে রহস্য।
EscapeUriString:
এই পদ্ধতিটি এমন কোনও অক্ষর থেকে রেহাই পাবে যা সংরক্ষিত বা সংরক্ষণযোগ্য অক্ষর নয়, শতাংশ চিহ্ন সহ। দ্রষ্টব্য যে এস্কেপউরিস্ট্রিং কোনও '#' চিহ্ন থেকেও রেহাই পাবে না।
EscapeDataString:
এই পদ্ধতিটি এমন কোনও অক্ষর থেকে মুক্তি পাবে যা শতকরা লক্ষণগুলি সহ কোনও সংরক্ষণযোগ্য অক্ষর নয়।
সুতরাং পার্থক্যটি কীভাবে তারা সংরক্ষিত অক্ষরগুলি পরিচালনা করে । EscapeDataStringতাদের পালিয়ে যায়; EscapeUriStringনা.
আরএফসি অনুসারে , সংরক্ষিত অক্ষরগুলি হ'ল ::/?#[]@!$&'()*+,;=
সম্পূর্ণতার জন্য, রক্ষিত অক্ষরগুলি বর্ণানুক্রমিক এবং -._~
উভয় পদ্ধতিই এমন অক্ষরগুলি এড়িয়ে যায় যেগুলি সংরক্ষিত নয় এবং সংরক্ষণযোগ্য নয়।
আমি সাধারণ ধারণার সাথে দ্বিমত পোষণ করি EscapeUriStringযা মন্দ। আমি মনে করি যে এমন একটি পদ্ধতি যা কেবল অবৈধ অক্ষরগুলি (যেমন স্পেসস) থেকে রক্ষা পায় এবং সংরক্ষিত অক্ষরগুলি কার্যকর নয়। তবে এটি কীভাবে %চরিত্রটি পরিচালনা করে তার একটি বিচক্ষণতা রয়েছে । শতাংশ-এনকোডেড অক্ষর ( %2 হেক্স অঙ্কের পরে) একটি ইউআরআইতে আইনী । আমি মনে করি EscapeUriStringযে এটি যদি এই প্যাটার্নটি সনাক্ত করে এবং %তাত্ক্ষণিকভাবে 2 হেক্স সংখ্যার দ্বারা অগ্রসর হয় তবে এনকোডিং এড়ানো যদি আরও কার্যকর হয় ।
একটি সহজ উদাহরণ
var data = "example.com/abc?DEF=あいう\x20えお";
Console.WriteLine(Uri.EscapeUriString(data));
Console.WriteLine(Uri.EscapeDataString(data));
Console.WriteLine(System.Net.WebUtility.UrlEncode(data));
Console.WriteLine(System.Web.HttpUtility.UrlEncode(data));
/*
=>
example.com/abc?DEF=%E3%81%82%E3%81%84%E3%81%86%20%E3%81%88%E3%81%8A
example.com%2Fabc%3FDEF%3D%E3%81%82%E3%81%84%E3%81%86%20%E3%81%88%E3%81%8A
example.com%2Fabc%3FDEF%3D%E3%81%82%E3%81%84%E3%81%86+%E3%81%88%E3%81%8A
example.com%2fabc%3fDEF%3d%e3%81%82%e3%81%84%e3%81%86+%e3%81%88%e3%81%8a
*/
Uri.EscapeDataString()। অন্যান্য পদ্ধতির সাথে, সিস্টেমের কাছে প্রতিটি সম্ভাব্য ইনপুটটির জন্য অভিযুক্ত ফলাফল তৈরি করার জন্য পর্যাপ্ত তথ্য নেই।