জাভাতে ইউআরএল ডিকোডিং কীভাবে করবেন?


323

জাভাতে, আমি এটি রূপান্তর করতে চাই:

https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type

এটি:

https://mywebsite/docs/english/site/mybook.do&request_type

আমার এ পর্যন্ত যা আছে:

class StringUTF 
{
    public static void main(String[] args) 
    {
        try{
            String url = 
               "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do" +
               "%3Frequest_type%3D%26type%3Dprivate";

            System.out.println(url+"Hello World!------->" +
                new String(url.getBytes("UTF-8"),"ASCII"));
        }
        catch(Exception E){
        }
    }
}

তবে এটি ঠিক কাজ করে না। এগুলি %3Aএবং %2Fফর্ম্যাটগুলি কী বলা হয় এবং আমি কীভাবে তাদের রূপান্তর করব?


@ স্টেফেন .. ইউআরএফএফ -8 এনকোড স্ট্রিং কেন একটি url হতে পারে না ..?
ক্র্যাকারপ্লেস

সমস্যাটি হ'ল কেবলমাত্র ইউআরএলটি ইউটিএফ -8 হতে পারে, ইউটিএফ -8 এর সাথে এই প্রশ্নের আসলেই কোনও সম্পর্ক নেই । আমি প্রশ্নটি যথাযথভাবে সম্পাদনা করেছি।
ক্রিস জেস্টার-ইয়ং

এটি (তত্ত্বের ভিত্তিতে) হতে পারে তবে আপনার উদাহরণের স্ট্রিংটি কোনও ইউটিএফ -8 এনকোডেড স্ট্রিং নয়। এটি URL- এনকোডেড ASCII স্ট্রিং। সুতরাং শিরোনাম বিভ্রান্তিকর।
স্টিফেন সি

এটিও লক্ষণীয় যে urlস্ট্রিংয়ের সমস্ত অক্ষর ASCII এবং স্ট্রিংটি ইউআরএল ডিকোড করার পরে এটিও সত্য। '%'একটি এএসসিআইআই চর এবং এটি হেক্সাডেসিমাল এর চেয়ে কম %xxহলে একটি এসসিআইআই চরকে উপস্থাপন করে । xx80
স্টিফেন সি

উত্তর:


634

ইউটিএফ -8 বা এএসসিআইআই এর মতো অক্ষর এনকোডিংগুলির সাথে এর কোনও যোগসূত্র নেই। আপনার যে স্ট্রিংটি রয়েছে তা URL এনকোডযুক্ত । এই জাতীয় এনকোডিং চরিত্রের এনকোডিংয়ের চেয়ে সম্পূর্ণ আলাদা something

এরকম কিছু চেষ্টা করুন:

try {
    String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
    // not going to happen - value came from JDK's own StandardCharsets
}

জাভা 10 Charsetএপিআই-তে সরাসরি সমর্থন যোগ করেছে যার অর্থ অসমর্থিত এনকোডিংএক্সেপশন ধরার দরকার নেই:

String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);

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


1
পদ্ধতিগুলি URLDecoderস্থিতিশীল তাই আপনাকে এটির কোনও নতুন উদাহরণ তৈরি করতে হবে না।
ল্যাজ

2
@ ট্রাইসমেজিস্টোস কেবলমাত্র সেই সংস্করণটি যেখানে আপনি অক্ষর এনকোডিং (দ্বিতীয় প্যারামিটার, "UTF-8") নির্দিষ্ট করেননি তা জাভা 7 এপিআই ডকুমেন্টেশন অনুসারে অবনতিযুক্ত । দুটি পরামিতি সহ সংস্করণটি ব্যবহার করুন।
জেস্পার

23
জাভা ব্যবহার যদি 1.7+ আপনি "হল UTF-8" স্ট্রিং এর স্ট্যাটিক সংস্করণ ব্যবহার করতে পারেন: StandardCharsets.UTF_8.name()এই প্যাকেজ থেকে: java.nio.charset.StandardCharsets। এর সাথে সম্পর্কিত: লিংক
শাহর

1
চরিত্রের এনকোডিংয়ের জন্য, এটি একটি দুর্দান্ত নিবন্ধটি খুব সুন্দর করে তোলে balusc.blogspot.in/2009/05/unicode-how-to-get-characters-right.html
ক্র্যাকারপ্লেস

4
এই বিষয়ে সতর্কতা অবলম্বন করুন। যেমনটি এখানে উল্লেখ করা হয়েছে: ব্লগ.লুনটেক.com / 2009 / 02 / 03/… এটি URL গুলি সম্পর্কে নয়, তবে HTML ফর্ম এনকোডিংয়ের জন্য।
মিশাল


47

এই উত্তরে হয়েছে আগে (যদিও এই প্রশ্নের প্রথম ছিল!):

"আপনার এটি জাভা.net. ইউআরআই ব্যবহার করা উচিত, যেহেতু ইউআরএলডিকোডার শ্রেণি x-www-form-urlencoded ডিকোডিং করে যা ভুল (নাম সত্ত্বেও এটি ফর্ম ডেটার জন্য)।"

ইউআরএল শ্রেণীর ডকুমেন্টেশন যেমন বলে:

ইউআরএলগুলির এনকোডিং এবং ডিকোডিং পরিচালনা করার প্রস্তাবিত উপায় হ'ল ইউআরআই ব্যবহার করা এবং টুআরআই () এবং ইউআরআই টু URL () ব্যবহার করে এই দুটি শ্রেণীর মধ্যে রূপান্তর করা ।

URLEncoder এবং URLDecoder শ্রেণীর ব্যবহার করা যাবে, কিন্তু শুধুমাত্র HTML ফর্ম এনকোডিং, যা এনকোডিং স্কীম সংজ্ঞায়িত হিসাবে একই নয় জন্য RFC2396

মূলত:

String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type";
System.out.println(new java.net.URI(url).getPath());

তোমাকে দিবে:

https://mywebsite/docs/english/site/mybook.do?request_type

6
জাভা 1.7 এ URLDecoder.decode(String, String)ওভারলোডটি হ্রাস করা হয় না। আপনাকে অবশ্যই URLDecoder.decode(String)এনকোডিং ছাড়াই ওভারলোডের উল্লেখ করছেন । আপনি স্পষ্টতার জন্য আপনার পোস্টটি আপডেট করতে চাইতে পারেন।
অ্যারোন

2
এই উত্তরটি বিভ্রান্তিকর; এই অবরুদ্ধের সাথে এই ব্লকের উদ্ধৃতিটির কোনও সম্পর্ক নেই। অবহেলিত পদ্ধতির জাভাদোক বলেছেন, এবং আমি আসলে উদ্ধৃতি দিয়েছি@deprecated The resulting string may vary depending on the platform's default encoding. Instead, use the decode(String,String) method to specify the encoding.
এমারসন ফারুগিয়া

1
উপরে বর্ণিত হিসাবে ইউআরআই-এর জন্য গেটপথ () কেবলমাত্র ইউআরআইয়ের পথ অংশটি ফেরত দেয়।
পেলপোট্রনিক

2
আমি ভুল না হলে কর্তৃপক্ষের অংশের পরে "পথ "টি ইউআরআই-র অংশ হিসাবে পরিচিত হয় (দেখুন: en.wikiki.org/wiki/Uniform_Source_Itentifier for पथ সংজ্ঞা) - এটি আমার কাছে এমন আচরণ বলে মনে হচ্ছে যা আমি দেখছি মান / সঠিক আচরণ। আমি জাভা ব্যবহার করছি 1.8.0_101 (অ্যান্ড্রয়েড স্টুডিওতে)। "GetAuthority ()" হিসাবে আপনি কী পান সেজন্য আমি কৌতূহলী হয়ে উঠব। এমনকি এই নিবন্ধ / উদাহরণটি দেখায় যে পথটি কেবল তাদের / ইউআরআইয়ের
২২656666

1
@ পেলপোট্রনিক পোস্টের কোডটি আসলে যে আউটপুটটি দেখায় তা মুদ্রণ করে (কমপক্ষে আমার জন্য)। আমি মনে করি এর কারণ হ'ল, ইউআরএল এনকোডিংয়ের কারণে, ইউআরআই নির্মাতা আসলে পুরো স্ট্রিংকে, ( https%3A%2F...), কেবল একটি ইউআরআইয়ের পথ হিসাবে চিকিত্সা করছেন ; কোনও কর্তৃত্ব, বা কোয়েরি ইত্যাদি নেই U এটি ইউআরআই অবজেক্টে স্ব স্ব প্রাপ্ত পদ্ধতিগুলি কল করে পরীক্ষা করা যেতে পারে। আপনি যদি ইউআরআই কনস্ট্রাক্টরের কাছে ডিকোড হওয়া পাঠ্যটি পাস করেন: new URI("https://mywebsite/do.....")তবে কলিং getPath()এবং অন্যান্য পদ্ধতিগুলি সঠিক ফলাফল দেবে।
ক্রু

14

%3Aএবং %2Fইউআরএল এনকোডেড অক্ষর। মধ্যে তাদের ফিরিয়ে রূপান্তর করতে এই জাভা কোড ব্যবহার করুন :এবং/

String decoded = java.net.URLDecoder.decode(url, "UTF-8");

2
এটি% 2
সিও

এটি একটি চেষ্টা / ক্যাপ ব্লকের মধ্যে আবৃত করা দরকার .. চেক করা ব্যতিক্রমগুলি সম্পর্কে আরও পড়ুন (এইটি) বনাম চেক করা স্ট্যাকওভারফ্লো.com
ব্রুনো ওল্ফ

5
 try {
        String result = URLDecoder.decode(urlString, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

5
public String decodeString(String URL)
    {

    String urlString="";
    try {
        urlString = URLDecoder.decode(URL,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block

        }

        return urlString;

    }

4
আপনি যে উত্তরটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে আরও উত্তর দিতে পারেন?
অ্যারিসোন


2
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;

public class URLDecoding { 

    String decoded = "";

    public String decodeMethod(String url) throws UnsupportedEncodingException
    {
        decoded = java.net.URLDecoder.decode(url, "UTF-8"); 
        return  decoded;
//"You should use java.net.URI to do this, as the URLDecoder class does x-www-form-urlencoded decoding which is wrong (despite the name, it's for form data)."
    }

    public String getPathMethod(String url) throws URISyntaxException 
    {
        decoded = new java.net.URI(url).getPath();  
        return  decoded; 
    }

    public static void main(String[] args) throws UnsupportedEncodingException, URISyntaxException 
    {
        System.out.println(" Here is your Decoded url with decode method : "+ new URLDecoding().decodeMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type")); 
        System.out.println("Here is your Decoded url with getPath method : "+ new URLDecoding().getPathMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest")); 

    } 

}

আপনি বিজ্ঞতার সাথে আপনার পদ্ধতি নির্বাচন করতে পারেন :)


0

Java.net.URI ক্লাস ব্যবহার:

public String getDecodedURL(String encodedUrl) {
    try {
        URI uri = new URI(encodedUrl);
        return uri.getScheme() + ":" + uri.getSchemeSpecificPart();
    } catch (Exception e) {
        return "";
    }
}

দয়া করে মনে রাখবেন যে ব্যতিক্রম হ্যান্ডলিং আরও ভাল হতে পারে তবে এই উদাহরণের জন্য এটি খুব বেশি প্রাসঙ্গিক নয়।

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