EscapeUriString এবং EscapeDataString মধ্যে পার্থক্য কি?


192

যদি কেবল ইউআরএল এনকোডিংয়ের জন্যই ডিল হয় তবে আমার এস্কেপউরিস্ট্রিং ব্যবহার করা উচিত ?


10
@ লিভভেনের উত্তরে বর্ণিত হিসাবে প্রতিটি স্বতন্ত্র মান ব্যবহার করে সর্বদা পালিয়ে যান Uri.EscapeDataString()। অন্যান্য পদ্ধতির সাথে, সিস্টেমের কাছে প্রতিটি সম্ভাব্য ইনপুটটির জন্য অভিযুক্ত ফলাফল তৈরি করার জন্য পর্যাপ্ত তথ্য নেই।
টিমো

উত্তর:


112

EscapeDataStringসর্বদা ব্যবহার করুন (কেন আরও তথ্যের জন্য, লিভভেনের উত্তর নীচে দেখুন)

সম্পাদনা : এনকোডিংয়ে কীভাবে দু'জনের মধ্যে পার্থক্য রয়েছে তার মৃত লিঙ্ক সরানো হয়েছে


3
আমি নিশ্চিত নই যে লিঙ্কটি বাস্তবে আরও তথ্য সরবরাহ করে কারণ এটি অনস্কেপিংয়ের পরিবর্তে এস্যাক্যাপিং সম্পর্কিত regarding
স্টিভেন

1
এটি মূলত একই পার্থক্য। আপনি যদি নিবন্ধটি সত্যই পড়ে থাকেন তবে মাঝের চারপাশে এমন একটি টেবিল রয়েছে যা পার্থক্যগুলি দেখানোর জন্য ( URLEncodeখুব বেশি তুলনা করা) প্রকৃতপক্ষে পালিয়ে যায় (আনস্কেপগুলি নয়)।
জেএলসি

2
এটি এখনও আমার কাছে পরিষ্কার নয় - আমি যদি পুরো ইউআরআই থেকে বেরিয়ে না গিয়ে এর কেবলমাত্র একটি অংশ - (অর্থাত্ কোয়েরি স্ট্রিং প্যারামিটারের ডেটা )? আমি কি ইউআরআই-এর ডেটা এড়িয়ে চলেছি, বা এস্কেপডাটাস্ট্রিং পুরোপুরি আলাদা কিছু বোঝায়?
BrainSlugs83

4
... কিছু টেস্টিং দেখে মনে হচ্ছে আমি ইউআরআই প্যারামিটারের জন্য এস্কেপডাটাস্ট্রিং চাই। আমি "আই হার্ট সি ++" স্ট্রিং দিয়ে পরীক্ষা করেছি এবং এস্কেপউরিস্ট্রিং "+" অক্ষরগুলিকে এনকোড করে নি, এটি কেবল তাদের মতোই ছেড়ে গেছে, এস্কেপডাটাস্ট্রিং তাদের "% 2B" তে সঠিকভাবে রূপান্তর করেছে।
BrainSlugs83

7
এটি একটি খারাপ উত্তর। আপনার কখনও এসেসউইরিস্ট্রিং ব্যবহার করা উচিত নয়, এটি কোনও অর্থ দেয় না। লিভভেনের উত্তর নীচে দেখুন (এবং এটি upvote)।
ব্র্যান্ডন প্যাডক

242

আমি বিদ্যমান উত্তরগুলি সন্তোষজনক পাইনি তাই আমি এই সমস্যাটি নিষ্পত্তি করার জন্য আরও গভীর খননের সিদ্ধান্ত নিয়েছি। আশ্চর্যজনকভাবে, উত্তরটি খুব সহজ:

ব্যবহারের জন্য কোনও বৈধ কারণ নেই (প্রায় *) Uri.EscapeUriString। আপনার যদি কোনও স্ট্রিং শতাংশ-এনকোড করার দরকার হয় তবে সর্বদা ব্যবহার করুন Uri.EscapeDataString

* বৈধ ব্যবহারের ক্ষেত্রে শেষ অনুচ্ছেদটি দেখুন।

কেন? ডকুমেন্টেশন অনুযায়ী :

ইউরি কনস্ট্রাক্টরের প্যারামিটার হওয়ার জন্য একটি অবিচ্ছিন্ন ইউআরআই স্ট্রিং প্রস্তুত করতে EscapeUriString পদ্ধতিটি ব্যবহার করুন।

এটি সত্যিকার অর্থে বোঝায় না। আরএফসি 2396 অনুসারে :

একটি ইউআরআই সর্বদা একটি "পালানো" ফর্মের মধ্যে থাকে, যেহেতু একটি সম্পূর্ণ ইউআরআইকে অব্যাহতি দেওয়া বা আনইস্কেপ করা তার শব্দার্থবিজ্ঞানের পরিবর্তন করতে পারে।

উদ্ধৃত আরএফসি আরএফসি 3986 দ্বারা অচল হয়ে পড়েছে , পয়েন্টটি এখনও রয়েছে। আসুন কয়েকটি কংক্রিট উদাহরণ দেখে এটি যাচাই করুন:

  1. আপনার মত একটি সাধারণ ইউআরআই আছে:

    http://example.org/

    Uri.EscapeUriString এটি পরিবর্তন করবে না।

  2. আপনি পালানোর বিষয়ে বিবেচনা না করে ম্যানুয়ালি ক্যোয়ারী স্ট্রিং সম্পাদনা করার সিদ্ধান্ত নিয়েছেন:

    http://example.org/?key=two words

    Uri.EscapeUriString (সঠিকভাবে) আপনার জন্য স্থান পালাতে হবে:

    http://example.org/?key=two%20words
  3. আপনি আরও জিজ্ঞাসা স্ট্রিং ম্যানুয়ালি সম্পাদনা করার সিদ্ধান্ত নিন:

    http://example.org/?parameter=father&son

    যাইহোক, এই স্ট্রিংটি পরিবর্তিত হবে না Uri.EscapeUriString, কারণ এটি ধরে নিয়েছে যে এম্পারস্যান্ডটি অন্য কী-মান জুটির সূচনা করে। এটি আপনার ইচ্ছা মত বা নাও হতে পারে।

  4. আপনি স্থির করেন যে আপনি প্রকৃতপক্ষে 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কোনও সর্বশেষ অবলম্বন হিসাবে ব্যবহার করার জন্য অর্থবোধ করে না ? তবে পূর্বে উল্লিখিত সতর্কতামূলক প্রয়োগগুলি - যদি ব্যবহারকারী দ্বারা সরবরাহিত ইউআরআই দ্ব্যর্থহীন হয় তবে ফলাফলগুলি পছন্দসই হতে পারে না।


4
বাহ, অবশেষে এই বিষয়টি পরিষ্কার করার জন্য আপনাকে ধন্যবাদ। আগের দুটি উত্তর খুব একটা সহায়ক ছিল না।
এভারপ্রেসড

3
ঠিক তাই. এসেসউইরিস্ট্রিং (উইন 32 এ এস্কআপআর্লের ডিফল্ট আচরণের মতো) এমন কেউ তৈরি করেছিলেন যা ইউআরআই বুঝতে পারে না বা পালাতে পারে না। এটি এমন কিছু তৈরির জন্য একটি বিভ্রান্ত প্রচেষ্টা যা একটি ত্রুটিযুক্ত ইউআরআই লাগে এবং কখনও কখনও এটির জন্য সংস্করণে রূপান্তরিত করে। তবে এটি নির্ভরযোগ্যভাবে এটি করার জন্য প্রয়োজনীয় তথ্য নেই। এটি প্রায়শই এস্কেপডাটাস্ট্রিংয়ের স্থানে ব্যবহৃত হয় যা খুব সমস্যাযুক্ত। আমি আশা করি এস্কআপআরস্ট্রিংয়ের অস্তিত্ব না থাকে। এটির প্রতিটি ব্যবহারই ভুল।
ব্র্যান্ডন প্যাডক

4
সুন্দরভাবে ব্যাখ্যা করা +1 এটি গ্রহণযোগ্য লিঙ্কের উত্তরের চেয়ে অনেক ভাল
এহসান সাজ্জাদ

1
এই উত্তর আরও মনোযোগ প্রয়োজন। এটি করার সঠিক উপায়। অন্যান্য উত্তরের দৃশ্যাবলী রয়েছে যেখানে তারা উদ্দেশ্যযুক্ত ফলাফলগুলি উত্পাদন করে না।
টিমো

1
... অবশ্যই encodeURI/ Uri.EscapeUriStringযেমন প্রয়োজন হয় না প্রায়শই encodeURIComponent/ Uri.EscapeDataString(যেহেতু যখন আপনি অন্ধ URL গুলি করে একটি URI প্রেক্ষাপটে ব্যবহার করা আবশ্যক সঙ্গে deaing হয়) তার জায়গা নেই, কিন্তু যে মানে না।
ক্রিসেন্ট তাজা

56

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

https://www.google.com/?q=happy+cat

এটি একটি বৈধ ইউআরআই (এটি চেষ্টা করুন), এবং EscapeUriStringএটি কোনও সংশোধন করবে না।

এখন গুগলকে "হ্যাপি সি ++" এর জন্য জিজ্ঞাসা করার বিষয়টি বিবেচনা করুন:

https://www.google.com/?q=happy+c++

এটি একটি বৈধ ইউআরআই (এটি চেষ্টা করুন), তবে এটি "হ্যাপি সি" এর জন্য একটি অনুসন্ধান তৈরি করে, কারণ দুটি প্লাসকে স্পেস হিসাবে ব্যাখ্যা করা হয়। এটির সমাধানের জন্য, আমরা "হ্যাপি সি ++" EscapeDataStringএবং ভয়েলা * :

https://www.google.com/?q=happy+c%2B%2B

*) এনকোডযুক্ত ডেটা স্ট্রিংটি আসলে "হ্যাপি% 20c% 2B% 2B"; স্পেস ক্যারেক্টারের জন্য% 20 হেক্স, এবং প্লাস চরিত্রের জন্য% 2 বি হেক্স is

আপনি UriBuilderযেমনটি ব্যবহার করা উচিত তা যদি ব্যবহার করেন তবে আপনাকে কেবল EscapeDataStringআপনার পুরো ইউআরআইয়ের কিছু উপাদান সঠিকভাবে পালাতে হবে। @ লিভভেনের এই প্রশ্নের উত্তর আরও প্রমাণ করে যে ব্যবহার করার কোনও কারণ নেই EscapeUriString


ধন্যবাদ। উদাহরণস্বরূপ, যখন আপনার কোনও ইউআরআই স্ট্রিং রয়েছে যা আপনাকে এনকোড করা দরকার তখন কী হবে "https://www.google.com/?q=happy c++"। দেখে মনে হচ্ছে আমাকে "?" এ নিজেই বিভক্ত হওয়া দরকার, না এর থেকে আরও ভাল উপায় আছে?
wensveen

আপনি যদি পুরো ইউআরএলটিকে অন্য কোনও ইউআরএলকে প্যারামিটার হিসাবে পাস করে থাকেন তবে ব্যবহার করুন EscapeDataString। আপনার প্রদত্ত URL টি যদি সত্যিকারের URL হয় তবে হ্যাঁ আপনি কেবল বিভক্ত করতে চান ?
শেঠ

7

উত্সের মন্তব্যগুলি স্পষ্টভাবে পার্থক্যটির ঠিকানা দেয়। এক্সএমএল ডকুমেন্টেশন মন্তব্যের মাধ্যমে এই তথ্যটি কেন সামনে আনা হয়নি তা আমার কাছে রহস্য।

EscapeUriString:

এই পদ্ধতিটি এমন কোনও অক্ষর থেকে রেহাই পাবে যা সংরক্ষিত বা সংরক্ষণযোগ্য অক্ষর নয়, শতাংশ চিহ্ন সহ। দ্রষ্টব্য যে এস্কেপউরিস্ট্রিং কোনও '#' চিহ্ন থেকেও রেহাই পাবে না।

EscapeDataString:

এই পদ্ধতিটি এমন কোনও অক্ষর থেকে মুক্তি পাবে যা শতকরা লক্ষণগুলি সহ কোনও সংরক্ষণযোগ্য অক্ষর নয়।

সুতরাং পার্থক্যটি কীভাবে তারা সংরক্ষিত অক্ষরগুলি পরিচালনা করে । EscapeDataStringতাদের পালিয়ে যায়; EscapeUriStringনা.

আরএফসি অনুসারে , সংরক্ষিত অক্ষরগুলি হ'ল ::/?#[]@!$&'()*+,;=

সম্পূর্ণতার জন্য, রক্ষিত অক্ষরগুলি বর্ণানুক্রমিক এবং -._~

উভয় পদ্ধতিই এমন অক্ষরগুলি এড়িয়ে যায় যেগুলি সংরক্ষিত নয় এবং সংরক্ষণযোগ্য নয়।

আমি সাধারণ ধারণার সাথে দ্বিমত পোষণ করি EscapeUriStringযা মন্দ। আমি মনে করি যে এমন একটি পদ্ধতি যা কেবল অবৈধ অক্ষরগুলি (যেমন স্পেসস) থেকে রক্ষা পায় এবং সংরক্ষিত অক্ষরগুলি কার্যকর নয়। তবে এটি কীভাবে %চরিত্রটি পরিচালনা করে তার একটি বিচক্ষণতা রয়েছে । শতাংশ-এনকোডেড অক্ষর ( %2 হেক্স অঙ্কের পরে) একটি ইউআরআইতে আইনী । আমি মনে করি EscapeUriStringযে এটি যদি এই প্যাটার্নটি সনাক্ত করে এবং %তাত্ক্ষণিকভাবে 2 হেক্স সংখ্যার দ্বারা অগ্রসর হয় তবে এনকোডিং এড়ানো যদি আরও কার্যকর হয় ।


1

একটি সহজ উদাহরণ

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
*/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.