আপনি কিভাবে System.Web ব্যবহার না করে UrlEncode করবেন?


310

আমি একটি উইন্ডো ক্লায়েন্ট অ্যাপ্লিকেশন লেখার চেষ্টা করছি যা একটি ওয়েব সাইটকে ডেটার জন্য কল করে। সর্বনিম্ন ইনস্টল রাখতে আমি । নেট ফ্রেমওয়ার্ক ক্লায়েন্ট প্রোফাইলে কেবলমাত্র dlls ব্যবহার করার চেষ্টা করছি । সমস্যাটি হ'ল আমাকে কিছু প্যারামিটারগুলি UrlEncode করা দরকার, System.Web.dll যা ক্লায়েন্ট পোফিলের অংশ নয়, তা আমদানি না করে কী করার সহজ উপায় আছে?


আপনি কীভাবে ওয়েব সাইটে কলটি করছেন তা দেখাতে পারেন? সম্ভবত সেখানে কিছু করা যেতে পারে।
দারিন দিমিত্রভ

কৌতূহলের বাইরে, আপনি সিস্টেম.ওয়েব ব্যবহার না করে ডেটার জন্য কোনও ওয়েবসাইটকে কীভাবে কল করবেন?
প্যাট্রিক ম্যাকডোনাল্ড

@ প্যাট্রিক, তিনি সম্ভবত ব্যবহার করছেন WebRequestবা WebClient। এই কারণেই আমি এই নির্দিষ্ট কোডটি সম্পর্কে জিজ্ঞাসা করেছি কারণ এমন কিছু জিনিস রয়েছে যা সঠিকভাবে ইউআরএল এনকোডিং ডেটা সম্পর্কে করা যেতে পারে।
দারিন দিমিত্রভ

1
আমি একটি System.Net.WebRequest অবজেক্ট ব্যবহার করছি। তারপরে আমি getRequestStream কল করি এবং আমার পোস্ট পরামিতিগুলি প্রবাহে লিখি। আমি কনটেন্টটাইপটিকে "অ্যাপ্লিকেশন / এক্স-www-ফর্ম-urlencoded" তেও সেট করেছি।
মার্টিন ব্রাউন

1
আমি যদি কোনও জিইটি অনুরোধ সম্পাদন করে এবং ইউআরএলটিতে প্যারামিটার যুক্ত করে থাকি তবে এটি অবশ্যই সমানভাবে কার্যকর হবে।
মার্টিন ব্রাউন 16

উত্তর:


317

System.Uri.EscapeUriString() নির্দিষ্ট অক্ষরগুলির সাথে সমস্যা হতে পারে, আমার জন্য এটি স্ট্রিংয়ে একটি সংখ্যা / পাউন্ড '#' চিহ্ন ছিল।

যদি এটি আপনার পক্ষে সমস্যা হয় তবে চেষ্টা করুন:

System.Uri.EscapeDataString() //Works excellent with individual values

এখানে একটি এসও প্রশ্নের উত্তর যা পার্থক্যটি ব্যাখ্যা করে:

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

এবং যে Uri.EscapeDataString()কোনও দিক থেকে ব্যবহার করার পরামর্শ দেয় ।


1
মিথ্যা: ব্লগস.এমএসএনএন / বি / ইয়্যাংজাইন্ড / অর্চিভ / ২০০6 / 11 / 09/ … আপনার আরও প্লাস চিহ্নের সমস্যা রয়েছে কারণ এগুলি আনডকোড করা হবে না।
ক্রিস ওয়েবার

7
এই ব্লগ পোস্টটি কিছুটা পুরানো এবং আমি কেবল "উরি পালিয়ে" একটি সম্পূর্ণ ইউআরএল পেয়েছি এবং সমস্ত স্পেস% 20 হয়ে গেছে, তাই আমি মনে করি তারা এটিকে ঠিক করে দিয়েছেন। আমি। নেট 4.5 ব্যবহার করছি।
রদি

আপনি যদি কোনও পোষ্ট অপারেশনের জন্য ডেটা প্রস্তুত করে থাকেন তবে এস্কেপডাটাস্ট্রিং খুব দীর্ঘ স্ট্রিং সমর্থন করে না। stackoverflow.com/questions/6695208/…
ব্রোন ডেভিস

Uri.EscapeUriStringপ্রকৃতপক্ষে খুব সমস্যাযুক্ত এবং এটি ব্যবহার করা উচিত নয়, কারণ এটি এমন কিছু করার চেষ্টা করে (সম্পূর্ণ ইউআরআইগুলি অব্যাহতি) যা ধারাবাহিকভাবে করা অসম্ভব একটি বিস্তারিত ব্যাখ্যার জন্য এই উত্তরটি দেখুন ।
লিভভেন

এছাড়াও একটি '' স্পেস অক্ষর।
ওয়াকাস শাব্বির

252

নেট। 4.5+ ব্যবহার করুন WebUtility

কেবল বিন্যাসের জন্য আমি এটিকে উত্তর হিসাবে জমা দিচ্ছি।

তাদের তুলনা করে কোনও ভাল উদাহরণ পাওয়া যায় নি:

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));

আউটপুট:

UrlEncode:             http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:       http://test#%20space%20123/text?var=val&another=two
EscapeDataString:      http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace:     http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:            http://test# space 123/text?var=val&another=two
UrlPathEncode:         http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

নেট। 4.5+ ব্যবহার করুন WebUtility.UrlEncode

এটি HttpUtility.UrlEncodeআরও সাধারণ অক্ষরের জন্য প্রতিলিপি (প্রি-ভি 4.0) প্রদর্শিত হবে :
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
দ্রষ্টব্য: EscapeUriStringএকটি বৈধ ইউরি স্ট্রিং রাখবে, যার কারণে এটি যতটা সম্ভব প্লেইনেক্সট অক্ষর ব্যবহার করে।

বিভিন্ন এনকোডিংয়ের তুলনা করে একটি সারণীর জন্য এই উত্তরটি দেখুন:
https://stackoverflow.com/a/11236038/555798

লাইন ব্রেক তাদের সমস্ত এখানে (ব্যতীত অন্য তালিকাভুক্ত HttpUtility.HtmlEncode) রূপান্তর করবে "\n\r"মধ্যে %0a%0dবা%0A%0D

দয়া করে এটিকে সম্পাদনা করতে এবং আমার পরীক্ষার স্ট্রিংয়ে নতুন অক্ষর যুক্ত করতে বা মন্তব্যগুলিতে রেখে দিন এবং আমি এটি সম্পাদনা করব।


আমার ক্ষেত্রে যখন আমি গাড়ীর রিটার্ন এবং লাইন ফিডগুলি এনকোড করছিলাম তখন তার EscapeDataStringপরিবর্তে আমাকে ব্যবহার EscapeUriStringকরতে হয়েছিল এবং এর জন্য আরও আক্রমণাত্মক পালানো দরকার ছিলEscapeDataString
ডেভিড ও'মায়ারা

1
আরও উদাহরণ, আপনি চাইলে আপনার নিজের পরীক্ষার কেস সরবরাহ করতে পারেন। এটি চালানোর একটি নমুনা এবং অন্যান্য এনকোডিং পদ্ধতি যা পার্থক্য দেখায় ডটনেটফিটাল.নাথ
মাসলো

3
ওয়েব ইউটিলিটি.আরলএনকোড () এবং ওয়েব ইউটিলিটি.উর্লডেকোড () হ'ল 4.5+। তাদের উপস্থিতি নেই 4.0।
ডেরেক কালভিট

এমএসডিএন বলে: "ইউনিভার্সাল উইন্ডোজ প্ল্যাটফর্ম: ৪.৫ থেকে পাওয়া যায়। নেট নেট ফ্রেমওয়ার্ক: ৪.০ থেকে পাওয়া যায়" ...
থাইমাইন

54

তুমি ব্যবহার করতে পার

Uri.EcreenUriString (দেখুন http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )


এই এবং এস্কেপডাটাস্ট্রিংয়ের মধ্যে কোনও পার্থক্য রয়েছে?
মার্টিন ব্রাউন

3
আপনি EscapeUriString ব্যবহার করতে চান। EscapeUriString পুরো ইউআরএলটি এনকোড করার চেষ্টা করবে (অন্তর্ভুক্ত http: // অংশ) যখন এস্কেপইরিস্ট্রিং বুঝতে পারে আসলে কোন অংশগুলি এনকোড করা উচিত
ম্যাথিউ ম্যানেলা

1
আমি দেখতে পাচ্ছি, সুতরাং এই পরিস্থিতিতে আমি সম্ভবত প্যাসিমাডাস্ট্রিং চাইব কারণ আমি প্যারামিটার হিসাবে কোনও ইউআরএল পাস করতে চাই। আমি এই দৃষ্টান্তে একটি URL এ যুক্ত করছি to
মার্টিন ব্রাউন

5
@ ম্যাথিউমেনেলা আমি নিশ্চিত যে আপনার অক্টোবরের মন্তব্যে পড়া উচিত দ্য এস্কেপডাটাস্ট্রিং এনকোড করার চেষ্টা করবে ...
মাসলো

ব্যবহার করবেন না Uri.EscapeUriString। কোন অংশগুলি এনকোড করা উচিত তা "বুঝতে" পারে না, এটি কিছু করার (পুরো ইউআরআইগুলি অব্যাহতি দেওয়ার) জন্য একটি বিভ্রান্ত প্রচেষ্টা যা ধারাবাহিকভাবে করা অসম্ভব। বিস্তারিত ব্যাখ্যার জন্য এই উত্তরটি দেখুন ।
লিভভেন

20

এখানে উত্তরগুলি খুব ভাল, তবে এখনও আমার পক্ষে অপর্যাপ্ত।

আমি একটি ছোট লুপ লিখেছি যা 0 থেকে 255 পর্যন্ত সমস্ত অক্ষরের Uri.EscapeUriStringসাথে তুলনা করে Uri.EscapeDataString

দ্রষ্টব্য: উভয় ফাংশনের অন্তর্নিহিত বুদ্ধি রয়েছে যে 0x80 এর উপরে বর্ণগুলি প্রথমে ইউটিএফ -8 এনকোডড এবং তারপরে শতাংশ এনকোডেড রয়েছে।

ফলাফল এখানে:

******* Different *******

'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"


******* Not escaped *******

'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"

'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"

'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"

'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"

******* UTF 8 *******

.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....

EscapeUriStringইউআরএলগুলি এনকোড করতে ব্যবহার করতে হয়, যখন EscapeDataStringকোনও কুকির বিষয়বস্তু উদাহরণস্বরূপ এনকোড করতে ব্যবহৃত হয়, কারণ কুকির ডেটাতে অবশ্যই সংরক্ষিত অক্ষর '='এবং নেই ';'


এখানে চমৎকার বিশ্লেষণ এবং ব্রেকডাউন, খুব সহায়ক। যদি কারও কাছে পারফরম্যান্সের মানদণ্ড (তিনটি পদ্ধতির তুলনা করা) থাকে বা জানা থাকে তবে তা দেখতেও ভাল লাগবে
শন উইলসন

এটি একটি ভাল বিশ্লেষণ এবং গ্রহণযোগ্যতাটি হ'ল আপনার ব্যবহার করা উচিত নয় Uri.EscapeUriString, কারণ সম্পূর্ণ ইউআরআইগুলি পালিয়ে যাওয়া ধারাবাহিকভাবে করা অসম্ভব। বিস্তারিত ব্যাখ্যার জন্য এই উত্তরটি দেখুন ।
লিভভেন

16

ক্লায়েন্ট প্রোফাইল ব্যবহারযোগ্য সংস্করণ, সিস্টেম. নেট.ওয়েব ইউটিলিটি ক্লাস, ক্লায়েন্ট প্রোফাইল সিস্টেম.ডল-এ উপস্থিত রয়েছে। এখানে এমএসডিএন লিঙ্কটি রয়েছে:

WebUtility


আমি নোট করব যে সেই শ্রেণীর জন্য সহায়তা পৃষ্ঠাটি সুনির্দিষ্টভাবে বলেছে "ওয়েব অনুরোধগুলি প্রক্রিয়া করার সময় URL গুলির এনকোডিং এবং ডিকোডিংয়ের জন্য পদ্ধতি সরবরাহ করে।" সুতরাং এটি কেবল এমন হতে পারে যে তারা পদ্ধতিগুলির নামটি ভালভাবে রাখেনি।
জেমস হোয়াইট

ভালো কথা, বলুন, আপনি কেন ভাইকে ভোট দিবেন না;) এই ডাউন ভোটটি আমাকে 2 বছর ধরে ভোগ করছে! জে.के ... তবে সত্যই সত্যই এই কারণেই আমি লিঙ্কটি পোস্ট করেছি, দুর্ভাগ্য যে মাইক্রোসফ্টের ডক্সে ত্রুটির জন্য আমি খ্যাতি পেয়েছি ...
স্প্রেগ

11
দেখে মনে হচ্ছে urlEncode এবং urlDecode কেবলমাত্র নেট এর 4.5 সংস্করণে ওয়েব ইউটিলিটিতে যুক্ত হয়েছিল।
মার্টিন ব্রাউন

8

এখানে কোনও পোষ্ট অনুরোধ প্রেরণের একটি উদাহরণ যা application/x-www-form-urlencodedসামগ্রীর ধরণ ব্যবহার করে প্যারামিটারগুলিকে সঠিকভাবে এনকোড করে :

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
    };
    var result = client.UploadValues("http://foo.com", values);
}


-3
System.Net.WebUtility.HtmlDecode

ওয়েব ইউটিলিটি ক্লাস ওয়েব অনুরোধগুলি প্রক্রিয়া করার সময় ইউআরএলগুলি এনকোডিং এবং ডিকোডিংয়ের জন্য পদ্ধতি সরবরাহ করে। এটি এইচটিপি ইউটিলিটির মতো একই কাজ করে তবে এটি সিস্টেমের বাইরে নেই e ওয়েব নামস্থান
আলেকজান্দ্রু

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