জাভাতে ইউআরএল কোয়েরি প্যারামিটারগুলি এনকোডিং


108

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

দুটি সূক্ষ্মতা রয়েছে যা সম্পর্কে আমি নিশ্চিত নই:

  1. ইউআরএলগুলিতে স্পেসগুলি "+" হিসাবে বা "% 20" হিসাবে এনকোড করা উচিত? ক্রোমে আমি যদি "http://google.com/foo=?bar me" টাইপ করি তবে ক্রোম এটিকে% 20 দিয়ে এনকোড করতে পরিবর্তন করে
  2. ":"% 3B হিসাবে কলোনগুলি এনকোড করা কি সঠিক / সঠিক? ক্রোম করে না।

মন্তব্য:

  • java.net.URLEncoder.encodeকাজ করছে বলে মনে হচ্ছে না, এনকোডিং ডেটা ফর্ম জমা দেওয়ার জন্য বলে মনে হচ্ছে। উদাহরণস্বরূপ, এটি +পরিবর্তে স্থান এনকোড করে %20, এবং প্রয়োজনীয় নয় যা কোলনকে এনকোড করে।
  • java.net.URI ক্যোয়ারী প্যারামিটারগুলি এনকোড করে না

এই প্রশ্নটি দরকারী বলে মনে হচ্ছে: stackoverflow.com/questions/444112/…
অ্যালেক্স ব্ল্যাক

2
সন্ধানের অংশটির কাঠামোটি সার্ভার-নির্ভর, যদিও বেশিরভাগ application/x-www-form-urlencodedকী / মান জোড় আশা করে । আরও তথ্যের জন্য এখানে দেখুন: অবৈধ গ্যালারিগামেনটেক্সেপশন.ব্লগস্পট.com
ম্যাকডোয়েল

উত্তর:


127

java.net.URLEncoder.encode(String s, String encoding)সাহায্য করতে পারেন। এটি HTML ফর্ম এনকোডিং অনুসরণ করে application/x-www-form-urlencoded

URLEncoder.encode(query, "UTF-8");

অন্যদিকে, পার্সেন্ট-এনকোডিং ( ইউআরএল এনকোডিং হিসাবে পরিচিত ) এর সাথে স্থান এনকোড করে %20। কোলন একটি সংরক্ষিত চরিত্র, তাই :এনকোডিংয়ের পরেও কোলন থাকবে।


3
আমি উল্লেখ করেছি যে আমি url এনকোডিং করি না বলে মনে করি না, পরিবর্তে এটি কোনও ফর্মের মাধ্যমে জমা দেওয়ার ডেটা এনকোড করে। মন্তব্য?
অ্যালেক্স ব্ল্যাক

এটা এ কারণে যে এর URLEncoderনিশ্চয়তা নেই application/x-www-form-urlencodedএমআইএমই বিন্যাস (যা একটি বৈধ এইচটিএমএল ফর্ম এনকোডিং যায়)। আমি ধরে নিচ্ছি যে আপনি যা খুঁজছেন তা নয়।
বুহাকে সিন্ধি

6
আমি ইউআরএলএনসি কোডার.ইনকোড ব্যবহার করে শেষ করেছি এবং "+" ""% 20 "এর সাথে প্রতিস্থাপন করেছি
অ্যালেক্স ব্ল্যাক

2
এটি "% 2F" এ স্ল্যাশগুলি এনকোড করে, ইউআরএল স্ল্যাশগুলি যেমন হয় তেমনি ছেড়ে দেওয়া উচিত নয়?
golimar

6
@ গলিমার না, এটি করা উচিত নয়। আপনি কেবলমাত্র পুরো URL টির জন্যই এটির প্যারামিটার মান দেওয়ার কথা। উদাহরণ বিবেচনা করুন http://example.com/?url=http://example.com/?q=c&sort=name। এটি এনকোড করা উচিত &sort=nameবা না? URL থেকে মান আলাদা করার কোনও উপায় নেই। আপনার প্রথম স্থানে মান এনকোডিং প্রয়োজন হবার সঠিক কারণ।
পাইজুসন

15

সম্পাদনা: URIUtilআর সাম্প্রতিক সংস্করণগুলিতে আর উপলভ্য নয়, জাভাতে ভাল উত্তর - এনকোড ইউআরএল বা মিঃ সিন্ধির এই থ্রেডে।


URIUtilঅ্যাপাচি httpclient সত্যিই দরকারী, যদিও কিছু বিকল্প আছে

URIUtil.encodeQuery(url);

উদাহরণস্বরূপ, এটি স্থানটি "% 20" এর পরিবর্তে "+" হিসাবে এনকোড করে

উভয়ই সঠিক প্রসঙ্গে পুরোপুরি বৈধ । যদিও আপনি যদি সত্যিই পছন্দ করেন তবে আপনি স্ট্রিং প্রতিস্থাপন করতে পারেন।


আমাকে মানতে হতই। এইচটিপিপ্লেইন্ট ব্যবহার করুন, আপনি অনেক বেশি সুখী হবেন।
দাশুন

আশাব্যঞ্জক লাগছে, সুযোগ পেয়ে একটি লিঙ্ক পেয়েছে? আমি গুগল করছি তবে অনেকের সন্ধান করছি।
অ্যালেক্স ব্ল্যাক

1
এই পদ্ধতিটি HTTPClient 4.1 তে উপস্থিত বলে মনে হচ্ছে না? hc.apache.org/httpcompferences-client-ga/httpclient/apidocs/org/…
অ্যালেক্স ব্ল্যাক

@ অ্যালেক্স, হুম এটি বিরক্তিকর, আমি সর্বদা ভাল ফলাফল সহ সেই রুটিনটি ব্যবহার করেছি। একটি ধারণা হ'ল 3 টি প্রকাশনা থেকে উত্স কোডটি দখল করা যেহেতু তারা সম্ভবত এটি এখন আর বজায় রাখতে চায়নি।
জোহান সিজবার্গ

1
URIUtil.encodeWithinQueryআপনি একটি পৃথক ক্যোয়ারী প্যারামিটার একটি এনকোড ব্যবহার করবেন যা মূল প্রশ্নটি মনে হচ্ছে বলে মনে হচ্ছে।
জেসি গ্লিক

13

দুর্ভাগ্যক্রমে, URLEncoder.encode () বৈধ শতাংশ-এনকোডিং তৈরি করে না ( আরএফসি 3986- তে বর্ণিত )।

URLEncoder.encode () স্থানটি "+" এ এনকোড না করা ব্যতীত সবকিছু ঠিকঠাকভাবে এনকোড করে। সমস্ত জাভা ইউআরআই এনকোডার যা আমি খুঁজে পেয়েছিলাম কেবলমাত্র ক্যোয়ারী, খণ্ড, পথের অংশগুলি ইত্যাদি এনকোড করার জন্য সরকারী পদ্ধতিগুলি প্রকাশ করতে পেরেছি - তবে "কাঁচা" এনকোডিংটি প্রকাশ করবেন না ose এটি দুর্ভাগ্যজনক কারণ খণ্ড এবং ক্যোয়ারিকে + এ স্থান এনকোড করার অনুমতি দেওয়া হয়েছে, সুতরাং আমরা সেগুলি ব্যবহার করতে চাই না। পাথটি যথাযথভাবে এনকোড করা হয়েছে তবে এটি প্রথমে "নরমালাইজড" হয় তাই আমরা এটি 'জেনেরিক' এনকোডিংয়ের জন্য ব্যবহার করতে পারি না।

আমি সেরা সমাধানটি নিয়ে আসতে পারি:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

যদি আপনার replaceAll()জন্য খুব ধীর হয় তবে আমার ধারণা বিকল্পটি হ'ল আপনার নিজের এনকোডারটি রোল করা ...

সম্পাদনা: আমার এখানে প্রথমে এই কোডটি ছিল যা "?", "&", "=" সঠিকভাবে এনকোড করে না:

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);

+একটি স্থানের পুরোপুরি বৈধ এনকোডিং।
লরেন্স ডল

@ লাওরেন্সডল এটি সত্য তবে কখনও কখনও +ভুল ব্যাখ্যা করা যেতে পারে - সি # ব্লগস.এমএসডন.মাইক্রোসফ্ট্র
ইয়ংক্সাইন্ড/

এই. আমি জাভাস্ক্রিপ্টের encodeURIComponentপদ্ধতি আউটপুটটির বিপরীতে বিভিন্ন বিকল্পের তুলনা করেছি এবং আমি চেষ্টা করেছি এমনদের জন্য এটিই একমাত্র সঠিক ম্যাচ (স্পেস, তুর্কি এবং জার্মান বিশেষ অক্ষরের অনুসন্ধান)।
উত্কু dezdemir

8

কোয়েরিতে% 3B হিসাবে কোনও কোলনকে এনকোড করা প্রয়োজন হয় না, যদিও এটি করা অবৈধ নয়।

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

এটিতেও মনে হয় যে কেবল শতাংশ-এনকোড করা স্থানগুলি বৈধ, কারণ আমি সন্দেহ করি যে স্থানটি একটি আলফা বা একটি ডিজিট

আরও তথ্যের জন্য ইউআরআই স্পেসিফিকেশন তাকান ।


তবে এটি করা ইউআরআই এর অর্থ পরিবর্তন করতে পারে, যেহেতু ক্যোরি স্ট্রিংয়ের ব্যাখ্যাটি সার্ভারের উপরে। আপনি যদি application/x-www-form-urlencodedকোয়েরি স্ট্রিং তৈরি করে থাকেন তবে হয় ঠিক আছে। আপনি যদি কোনও ইউআরএল ঠিক করে থাকেন যা ব্যবহারকারী টাইপ করেছেন / আটকানো হয়েছে তবে :একা থাকতে হবে।
টিসি।

@tc। আপনি ঠিক বলেছেন, যদি কোলন একটি সাধারণ ডিলিমিটার হিসাবে ব্যবহার করা হয় (আরএফসি এর 12 পৃষ্ঠা); তবে, যদি এটি সাধারণ ডিলিমিটার হিসাবে ব্যবহার না করা হয়, তবে উভয় এনকোডিংয়ের অভিন্নরূপে সমাধান করা উচিত।
এডউইন বাক 21

ইউআরএলগুলি সত্যই ইউআরআই-এর সাবসেট না হওয়ায় আপনাকেও
অ্যাডাম জেন্ট

5

জাভা ইউআরএলএলএনকোডারটি অন্তর্নির্মিত যা করা উচিত তা করছে এবং আপনার এটি ব্যবহার করা উচিত।

একটি "+" বা "% 20" উভয়ই কোনও ইউআরএল-তে স্থান অক্ষরের জন্য বৈধ প্রতিস্থাপন। হয় একজন কাজ করবে।

একটি ":" এনকোড করা উচিত , কারণ এটি পৃথককারী চরিত্র। অর্থাত্ http: // foo বা ftp: // বার । কোনও নির্দিষ্ট ব্রাউজার যখন এনকোড করা হয় না তখন এটি পরিচালনা করতে পারে তা সত্য হয় না। আপনি তাদের এনকোড করা উচিত।

ভাল অনুশীলনের বিষয়টি হিসাবে, কোনও চরিত্রের এনকোডিং প্যারামিটারটি গ্রহণ করা পদ্ধতিটি নিশ্চিত করতে ভুলবেন না। ইউটিএফ -8 সাধারণত সেখানে ব্যবহৃত হয় তবে আপনার এটি স্পষ্টভাবে সরবরাহ করা উচিত।

URLEncoder.encode(yourUrl, "UTF-8");

5
+এটি কেবল স্থানের প্রতিনিধিত্ব application/x-www-form-urlencoded; এটি HTTP- র মধ্যে সীমাবদ্ধ থাকার পরেও কাজ করার গ্যারান্টিযুক্ত নয়। একইভাবে, :বৈধ একটি ক্যোয়েরি স্ট্রিং এবং করা উচিত নয় রূপান্তরিত করা %3B; একটি সার্ভার তাদের আলাদাভাবে ব্যাখ্যা করতে বেছে নিতে পারে।
টিসি।

1
এই পদ্ধতি আরো পুরো URL স্ল্যাশ এবং অন্যান্য অক্ষরের কোন অংশ যেমন হয় এনকোড http://করতে http%3A%2F%2Fযা সঠিক নয়
করতে ক্রা

2
@ টোকরা আপনার http://অংশটি এনকোড করার কথা নয় । পদ্ধতিটি ক্যোয়ারী প্যারামিটার এবং এনকোডযুক্ত ফর্ম ডেটার জন্য। তবে, যদি আপনি কোয়েরি প্যারামিটার হিসাবে অন্য কোনও ওয়েবসাইটের ইউআরএল পাস করতে চান, তবে আপনি ইউআরএল পার্সারটিকে বিভ্রান্ত না করার জন্য এটিকে এনকোড করতে চান।
বেলডাজ

@tc আমার পাঠ্য w3.org/TR/html4/interact/forms.html#h-17.13.3.3 হ'ল সমস্ত জিইটি ফর্ম ডেটা application/x-www-form-urlencodedসামগ্রীর ধরণের হিসাবে এনকোড করা আছে । তার মানে কি এইচটিটিপি-র কাজ করা উচিত নয়?
বেলডাজ

0

আপনার যদি ইউআরএল এ কেবল স্থান সমস্যা থাকে have আমি কোড নীচে ব্যবহার করেছি এবং এটি সূক্ষ্ম কাজ করে

String url;
URL myUrl = new URL(url.replace(" ","%20"));

উদাহরণ: url হল

www.xyz.com?para=hello স্যার

তারপরে MuUrl এর আউটপুট হয়

www.xyz.com?para=hello%20sir


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