অ্যান্ড্রয়েডে ইউআরএল এনকোডিং


335

আপনি কীভাবে অ্যান্ড্রয়েডে কোনও ইউআরএল এনকোড করবেন ?

আমি ভেবেছিলাম এটি এমন ছিল:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);

যদি আমি উপরে করি, http://urlAsStringদ্বারা প্রতিস্থাপিত হয় http%3A%2F%2Fমধ্যে encodedURLএবং তারপর আমি একটি পেতে java.net.MalformedURLExceptionযখন আমি URL টি ব্যবহার করুন।

উত্তর:


630

আপনি পুরো ইউআরএলটি এনকোড করেন না, কেবলমাত্র এর কিছু অংশ "অবিশ্বস্ত উত্স" থেকে আসে।

String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;

অন্যথা, আপনি ব্যবহার করতে পারেন Strings.urlEncode (স্ট্রিং STR) এর DroidParts যে চেক করা ব্যতিক্রম নিক্ষেপ করে না।

বা এর মতো কিছু ব্যবহার করুন

String uri = Uri.parse("http://...")
                .buildUpon()
                .appendQueryParameter("key", "val")
                .build().toString();

1
পুরো ইউআরএল অবিশ্বস্ত হলে কী হবে? প্রোটোকল বাদে কি আমার সবকিছু এনকোড করা উচিত? আমি এটি করার একটি সুবিধার পদ্ধতি আশা করি।
এইচপিক

5
তারপরে এটি কেবল একটি ভাঙা ইউআরএল। ধারণাটি হ'ল ক্যোরির অংশটি ইউআরএল ভাঙা থেকে রোধ করা।
yanchenko

5
@hgpc - RFC3986 (ধারা 3 কটাক্ষপাত করা tools.ietf.org/html/rfc3986#section-3 )। এটি আপনাকে ইউআরআইয়ের বিভিন্ন অংশকে কীভাবে এনকোড করতে হবে তা বলে tells দুর্ভাগ্যক্রমে ইউআরআই এর প্রতিটি অংশের (হোস্ট, পথ, ক্যোয়ারী, ইত্যাদি) কিছুটা আলাদা এনকোডিং বিধি রয়েছে।
ডি.শ্যাওলি

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

8
আমি কেন এটি ব্যবহার করে অবহেলার সতর্কতা পাচ্ছি? Uri.encode(query);পরিবর্তে ব্যবহৃত হয়।
প্রসংশাথ

166

আমি এখানে একটি পরামর্শ যুক্ত করতে যাচ্ছি। আপনি এটি করতে পারেন যা কোনও বাহ্যিক গ্রন্থাগার পেতে এড়ানো হয়।

একবার চেষ্টা করে দেখুন:

String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();

আপনি দেখতে পাচ্ছেন যে এই বিশেষ ইউআরএলটিতে আমার সেই স্থানগুলি এনকোড করা দরকার যাতে আমি এটি একটি অনুরোধের জন্য ব্যবহার করতে পারি।

এটি আপনার কাছে অ্যান্ড্রয়েড ক্লাসে উপলব্ধ কয়েকটি দম্পতির সুবিধা গ্রহণ করে। প্রথমত, ইউআরএল শ্রেণি তার যথাযথ উপাদানগুলিতে একটি ইউআরএল ভাঙতে পারে যাতে আপনার কোনও স্ট্রিং অনুসন্ধান / প্রতিস্থাপনের কাজ করার দরকার নেই is দ্বিতীয়ত, আপনি যখন কোনও একক স্ট্রিংয়ের পরিবর্তে উপাদানগুলির মাধ্যমে একটি ইউআরআই নির্মাণ করেন তখন এই পদ্ধতির যথাযথভাবে পালিয়ে যাওয়া উপাদানগুলির ইউআরআই শ্রেণীর বৈশিষ্ট্যটি গ্রহণ করা হয়।

এই পদ্ধতির সৌন্দর্য হ'ল আপনি যে কোনও বৈধ ইউআরএল স্ট্রিং নিতে পারেন এবং এটি সম্পর্কে নিজের কোনও বিশেষ জ্ঞানের প্রয়োজন ছাড়াই এটি কাজ করতে পারেন।


19
এটি সঠিক উত্তর হওয়া উচিত। এটি করার আনুষ্ঠানিক এবং স্পষ্ট উপায়
আসঙ্ক সেনাবিরথ্না

3
ইউআরএলএসটিআরটি ইউআরএল কনস্ট্রাক্টরকে প্রেরণ করার আগে urlecode করা ভাল ধারণা হতে পারে। URLDecoder.decode (urlStr)
Jakob এরিকসন

1
পোস্টের জন্য ধন্যবাদ :) তবে আমি একটি সমস্যার মুখোমুখি হয়েছি। যদি ইউআরএলটি ইতিমধ্যে আংশিকভাবে এনকোড করা থাকে তবে এটি ইতিমধ্যে এনকোড করা অংশগুলি এনকোড করছে। আমার কি করা উচিৎ? উদাহরণস্বরূপ: dj-videos.us/Music/XclusiveSinGleTrack/320%20Kbps/... % 20% 2520 থেকে কোডেড হয়
পাগল

2
@berserk যদি এটি ইতিমধ্যে এনকোড করা থাকে তবে এটি এনকোড করবেন না। আংশিকভাবে এনকোড করা অবস্থায় আপনাকে এমন অবস্থায় প্রবেশ করা উচিত নয় বা আপনি নিশ্চিত নন যে এটি এনকোডড রয়েছে কি না।
লার্নের মারকুইস

3
এই পদ্ধতিটি C থেকে% C4% 9F এর মতো অক্ষরগুলিকে এনকোড করে না। একটি এনকোড গৃহীত!
আলেকজান্ডার প্রোকোফিয়েভ

74

অ্যান্ড্রয়েডের জন্য, আমি স্ট্রিং android.net.Uri.encode (স্ট্রিং) ব্যবহার করব

প্রদত্ত স্ট্রিংয়ের অক্ষরগুলিকে '%' হিসাবে এনকোড করে - ইউটিএফ -8 স্কিম ব্যবহার করে পালিয়ে যাওয়া অক্টেটগুলি। অক্ষর ("AZ", "আজ"), সংখ্যা ("0-9"), এবং অনারक्षित অক্ষর ("_- !. ~ '() *") অক্ষত রয়েছে। অন্যান্য সমস্ত অক্ষরকে এনকোড করে।

প্রাক্তন /

String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);

2
দুর্ভাগ্যক্রমে Uri.encode("a=1&b=1")উত্পাদিত a%3D1%26b%3D1তবে প্রত্যাশিতa=1&b=1
লন্টার

14
@ প্রতিক্ষার এটি প্রত্যাশিত ফলাফল। যদি ব্যবহারকারী a=1&b=1কোনও ক্যোয়ারী হিসাবে প্রবেশ করে , আপনি ঠিক সেটিকে জিজ্ঞাসা করতে চান।
অনুবিয়ান নুব

ইউআরএলএনসিএনডার.ইনকোড (স্ট্রিংহির, "ইউটিএফ -8") এর সাথে এটি কতটা আলাদা
স্টাকডওভারফ্লো

@ স্টককডওভারফ্লো একটি জিনিসের জন্য, ইউরি.এনকোড (স্ট্র) ইউআরএলএনসিওডার.ইনকোড (টিআরএইচ, "ইউটিএফ -8") এর বিপরীতে একটি চেক করা ব্যতিক্রম ছুঁড়ে ফেলবে না
ডিসেম্বর

50

এছাড়াও আপনি এটি ব্যবহার করতে পারেন

private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);

এটি সবচেয়ে সহজ পদ্ধতি


1
এটি সেরা সমাধান নয়, তবে এটি অবশ্যই একটি দুর্দান্ত দ্রুত সমাধান ... থেক্স
সেবাস্তিয়ান ব্রেইট

4
পুরো ইউআরএল অবিশ্বাস্য হয়ে উঠলে এটি দ্রুততম ফিক্স। ধন্যবাদ!
ব্যবহারকারী 1032613

আপনি কি নিশ্চিত যে%% কে অনুমতি দেওয়া উচিত? এটি কি এনকোড করা উচিত নয়?
মিডিয়ামওনে

1
কীভাবে এই ইউআরএলটি ভাগ করে নেওয়া সম্ভব হবে এবং তারপরে ব্যবহারকারী এই লিঙ্কটি খুলতে এবং পৃষ্ঠাটি দেখতে সক্ষম হবেন: এইচডিএমএল
আহমদ ইব্রাহিমী 21

3
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

1

আপনি নীচের পদ্ধতি ব্যবহার করতে পারেন

public static String parseUrl(String surl) throws Exception
{
    URL u = new URL(surl);
    return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString();
}

অথবা

public String parseURL(String url, Map<String, String> params)
{
    Builder builder = Uri.parse(url).buildUpon();
    for (String key : params.keySet())
    {
        builder.appendQueryParameter(key, params.get(key));
    }
    return builder.build().toString();
}

দ্বিতীয়টি প্রথমটির চেয়ে ভাল।


0

আরবি চরগুলি সন্ধান করুন এবং এর ইউটিএফ -8 এনকোডিংয়ের সাথে তাদের প্রতিস্থাপন করুন। এটার মতো কিছু:

for (int i = 0; i < urlAsString.length(); i++) {
    if (urlAsString.charAt(i) > 255) {
        urlAsString = urlAsString.substring(0, i) + URLEncoder.encode(urlAsString.charAt(i)+"", "UTF-8") + urlAsString.substring(i+1);
    }
}
encodedURL = urlAsString;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.