ترميز URL لـ Java لمعلمات سلسلة الاستعلام




http encoding (6)

قل لدي عنوان URL

http://example.com/query?q=

ولدي استعلام أدخله المستخدم مثل:

كلمة عشوائية £ 500 بنك $

أريد أن تكون النتيجة عنوان URL تم ترميزه بشكل صحيح:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

ما هي أفضل طريقة لتحقيق ذلك؟ لقد حاولت URLEncoder وإنشاء كائنات عنوان URL / عنوان URL ولكن لم يبرز أي منها بشكل صحيح تمامًا.


  1. استخدم هذا URLEncoder.encode (الاستعلام ، StandardCharsets.UTF_8.displayName ())؛ أو هذا: URLEncoder.encode (استعلام ، "UTF-8") ؛
  2. يمكنك استخدام رمز follwing.

    String encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8");//not change 
    String encodedUrl2 = URLEncoder.encode(query, "UTF-8");//changed
    String encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());//changed
    
    System.out.println("url1 " + encodedUrl1 + "\n" + "url2=" + encodedUrl2 + "\n" + "url3=" + encodedUrl3);
    

أود استخدام هذا الرمز:

Uri myUI = Uri.parse ("http://example.com/query").buildUpon().appendQueryParameter("q","random word A3500 bank 24").build();

توفر مكتبة Apache Http Components خيارًا أنيقًا لإنشاء معلمات استعلام وترميزها -

مع استخدام 4.x URLEncodedUtils - URLEncodedUtils

لاستخدام HttpClient 3.x - EncodingUtil


فيما يلي طريقة يمكنك استخدامها في التعليمات البرمجية الخاصة بك لتحويل سلسلة url وخريطة المعلمات إلى سلسلة عنوان url مشفرة صالحة تحتوي على معلمات الاستعلام.

String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
    if (parameters == null) {
        return url;
    }

    for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {

        final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
        final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");

        if (!url.contains("?")) {
            url += "?" + encodedKey + "=" + encodedValue;
        } else {
            url += "&" + encodedKey + "=" + encodedValue;
        }
    }

    return url;
}

يجب أن يكون URLEncoder هو الطريق للذهاب. لا يلزمك سوى وضع في اعتبارك ترميز اسم معلمة سلسلة البحث و / أو القيمة فقط ، وليس عنوان URL بالكامل ، بالتأكيد ليس حرف فاصل معلمة سلسلة الاستعلام & ولا حرف فاصل قيم اسم المعلمة = .

String q = "random word £500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");

لاحظ أن المسافات في معلمات طلب البحث ممثلة بـ + ، وليس %20 ، وهي صالحة شرعًا. عادة ما يتم استخدام %20 لتمثيل المسافات في URI نفسه (الجزء قبل حرف فاصل سلسلة استعلام URI ? ) ، وليس في سلسلة الاستعلام (الجزء بعد ? ).

لاحظ أيضًا أن هناك طريقتين encode() . واحد دون charset الحجة وآخر مع. تم إيقاف الوسيطة التي لا تحتوي على charset. لا تستخدمه مطلقًا ، وحدد دائمًا حجة charset. يوصي URLEncoder بشكل صريح باستخدام ترميز UTF-8 ، كما هو منصوص عليه من قبل RFC3986 و W3C .

كافة الأحرف الأخرى غير آمنة ويتم تحويلها أولاً إلى بايت واحد أو أكثر باستخدام بعض نظام الترميز. ثم يتم تمثيل كل بايت بواسطة سلسلة 3 أحرف "٪ xy" ، حيث xy هو تمثيل الست عشرية من البايت المكون من رقمين. نظام الترميز الموصى باستخدامه هو UTF-8 . ومع ذلك ، لأسباب تتعلق بالتوافق ، إذا لم يتم تحديد الترميز ، فسيتم استخدام الترميز الافتراضي للنظام الأساسي.

أنظر أيضا:


يجب أولاً إنشاء عنوان URI مثل:

    String urlStr = "http://www.example.com/CEREC® Materials & Accessories/IPS Empress® CAD.pdf"
    URL url= new URL(urlStr);
    URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());

ثم تحويل تلك السلسلة إلى ASCII:

    urlStr=uri.toASCIIString();

الآن يتم ترميز سلسلة url الخاصة بك أولاً قمنا بتشفير url بسيط ثم قمنا بتحويلها إلى ASCII String للتأكد من عدم وجود أحرف خارج US-ASCII في السلسلة. هذا بالضبط ما تفعله المتصفحات.





urlencode