উত্তর:
HttpServerUtility.UrlEncode
HttpUtility.UrlEncode
অভ্যন্তরীণভাবে ব্যবহার করবে । কোন নির্দিষ্ট পার্থক্য আছে। অস্তিত্বের কারণ Server.UrlEncode
হ'ল ক্লাসিক এএসপির সাথে সামঞ্জস্যতা।
আগে এই পদ্ধতিগুলির সাথে আমার উল্লেখযোগ্য মাথাব্যথা ছিল, আমি আপনাকে কোনও পরিবর্তনের এড়াতেUrlEncode
এবং পরিবর্তে ব্যবহারের পরামর্শ দিইUri.EscapeDataString
- কমপক্ষে এটির একটি বোধগম্য আচরণ রয়েছে।
দেখা যাক...
HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
//standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
// want, since you still need to
// escape special characters yourself
তবে আমার ব্যক্তিগত প্রিয় হতে পারে প্রিয়টি হ'ল এইচটিপি ইউটিলিটি Uআরলপ্যাথ এনকোড - এটি সত্যই বোধগম্য। এটি এনকোড করে:
এটিতে সুদৃশ্য সুনির্দিষ্ট এমএসডিএন ডকুমেন্টেশনও রয়েছে "ওয়েব সার্ভার থেকে ক্লায়েন্টে নির্ভরযোগ্য এইচটিটিপি স্থানান্তর করার জন্য ইউআরএল স্ট্রিংয়ের পাথ অংশটি এনকোড করে।" - আসলে এটি কী করে তা ব্যাখ্যা না করে। আপনি একটি উজির সাথে নিজেকে পায়ে গুলি করার সম্ভাবনা কম ...
সংক্ষেপে, ইউরি.এস্কেপডেটাস্ট্রিংয়ের সাথে আঁকুন ।
?
এবং কে বলতে চান কোনটি এনকোড করতে হবে এবং কোনটি পৃথককারী হিসাবে কাজ করবে? স্থান হিসাবে: উভয় ক্ষেত্রেই স্থানটি হ্যাশে রয়েছে তাই কোয়েরি-খণ্ডের উপস্থিতি বা অনুপস্থিতি কোনও বিষয় নয়। এবং পরিশেষে, এটি একটি ইউরির সাথে দূষিত করা অনর্থক, যেমনটি% যেমন রয়েছে দ্বিতীয় উদাহরণে। UrlPathEncode
পদ্ধতি প্লেইন borked হয় এবং কখনও ব্যবহার করা উচিত।
এটি প্রথম জিজ্ঞাসা করা হওয়ার প্রায় 9 বছর পরে ফরোড -ফরোয়ার্ড এবং .NET কোর এবং .NET স্ট্যান্ডার্ডের বিশ্বে, আমাদের কাছে ইউআরএল-এনকোডিংয়ের জন্য সবচেয়ে সাধারণ বিকল্পগুলি হ'ল ওয়েব ইউটিলিটি Uআরলএনকোড (আন্ডার System.Net
) এবং ইউরি .স্কেপডেটাস্ট্রিং । এখানে এবং অন্য কোথাও সর্বাধিক জনপ্রিয় উত্তরের দ্বারা বিচার করা, ইউরি.স্ক্রপ ডেটাস্ট্রিং পছন্দনীয় বলে মনে হয়। তবে কি তাই? পার্থক্যগুলি বোঝার জন্য আমি কিছু বিশ্লেষণ করেছি এবং আমি এখানে যা এলাম তা এখানে:
WebUtility.UrlEncode
এনকোড স্থান হিসাবে +
; Uri.EscapeDataString
এটি এনকোড হিসাবে %20
।Uri.EscapeDataString
শতাংশ-এনকোড !
, (
, )
, এবং *
; WebUtility.UrlEncode
না.WebUtility.UrlEncode
শতাংশ-এনকোড ~
; Uri.EscapeDataString
না.Uri.EscapeDataString
UriFormatException
স্ট্রিংগুলিকে 65,520 টির চেয়ে বেশি অক্ষরের উপরে ফেলে দেয় ; WebUtility.UrlEncode
না. ( আপনার ভাবা হতে পারে তার চেয়ে বেশি সাধারণ সমস্যা, বিশেষত ইউআরএল-এনকোডযুক্ত ফর্ম ডেটা নিয়ে কাজ করার সময় ))Uri.EscapeDataString
একটি ছোঁড়ার UriFormatException
উপর উচ্চ ভাড়াটে অক্ষর ; WebUtility.UrlEncode
না. (এটি একটি ইউটিএফ -16 জিনিস, সম্ভবত অনেক কম সাধারণ))ইউআরএল-এনকোডিংয়ের জন্য, অক্ষরগুলি 3 টির মধ্যে একটির মধ্যে ফিট করে: অনাবৃত (কোনও ইউআরএলে আইনী); সংরক্ষিত (বৈধ তবে এর বিশেষ অর্থ রয়েছে, তাই আপনি এটিকে এনকোড করতে চাইতে পারেন); এবং সমস্ত কিছু (সর্বদা এনকোড করা আবশ্যক)।
আরএফসি অনুসারে , সংরক্ষিত অক্ষরগুলি হ'ল ::/?#[]@!$&'()*+,;=
এবং অনিবদ্ধ অক্ষরগুলি বর্ণানুক্রমিক এবং -._~
ইউরি.স্ক্রপডাটা স্ট্রিং এর মিশনটি পরিষ্কারভাবে সংজ্ঞায়িত করে:% - সমস্ত সংরক্ষিত এবং অবৈধ অক্ষরগুলি কোড করে। ওয়েব ইউটিলিটি.আরল এনকোড সংজ্ঞা এবং বাস্তবায়ন উভয় ক্ষেত্রেই আরও স্পষ্ট । অদ্ভুতভাবে, এটি কিছু সংরক্ষিত অক্ষরগুলি এনকোড করে তবে অন্যগুলি নয় (কেন বন্ধনী এবং বন্ধনী নয় ??), এবং অপরিচিত এখনও এটি নিরপেক্ষভাবে সংরক্ষণযোগ্য ~
অক্ষরকে এনকোড করে ।
অতএব, আমি জনপ্রিয় পরামর্শটি সহ সম্মতি জানাই - সম্ভব হলে ইউরি.এইচপ্যাডটাটাস্ট্রিং ব্যবহার করুন এবং বুঝতে হবে যে সংরক্ষিত অক্ষরগুলি পছন্দ করে /
এবং ?
এনকোড হয়ে যায়। আপনার যদি বিশেষত ইউআরএল- এনকোডড ফর্মের সামগ্রীর সাথে বড় আকারের স্ট্রিংগুলির সাথে ডিল করতে হয় তবে আপনাকে ওয়েব ইউটিলিটি.আরলকনোডে ফিরে যেতে হবে এবং এর তীরচিহ্নগুলি গ্রহণ করতে হবে, না হলে সমস্যাটি ঘিরে কাজ করা উচিত।
সম্পাদনা করুন: আমি করেছি চেষ্টা সব quirks মধ্যে উপরে উল্লিখিত সংশোধনের Flurl মাধ্যমে Url.Encode
, Url.EncodeIllegalCharacters
এবং Url.Decode
স্ট্যাটিক পদ্ধতি। এগুলি মূল প্যাকেজে রয়েছে (যা ক্ষুদ্র এবং এতে এইচটিটিপি সমস্ত উপাদান অন্তর্ভুক্ত নয়), বা উত্স থেকে এগুলি ছিঁড়ে ফ্রি মনে করতে পারে না। এগুলিতে আপনার যে কোনও মন্তব্য / প্রতিক্রিয়া আমি স্বাগত জানাই।
কোন অক্ষরগুলি আলাদাভাবে এনকোড করা হয়েছে তা আবিষ্কার করতে আমি এখানে কোডটি ব্যবহার করেছি:
var diffs =
from i in Enumerable.Range(0, char.MaxValue + 1)
let c = (char)i
where !char.IsHighSurrogate(c)
let diff = new {
Original = c,
UrlEncode = WebUtility.UrlEncode(c.ToString()),
EscapeDataString = Uri.EscapeDataString(c.ToString()),
}
where diff.UrlEncode != diff.EscapeDataString
select diff;
foreach (var diff in diffs)
Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");
মনে রাখবেন যে সম্ভবত আপনি এই পদ্ধতিগুলির মধ্যে একটি ব্যবহার করা উচিত নয়। মাইক্রোসফ্টের অ্যান্টি-ক্রস সাইট স্ক্রিপ্টিং লাইব্রেরিতে প্রতিস্থাপনগুলি অন্তর্ভুক্ত রয়েছে HttpUtility.UrlEncode
এবং HttpUtility.HtmlEncode
এটি উভয়ই আরও মান-সম্মতিযুক্ত এবং আরও সুরক্ষিত। বোনাস হিসাবে, আপনি একটি JavaScriptEncode
পদ্ধতিও পাবেন।