سؤال

أحاول أن أقرأ في عنوان URL للصورة. كما ذكر في وثائق جافا، حاولت تحويل عنوان URL إلى Uri

String imageURL = "http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg";
URL url = new URL(imageURL);
url = new URI(url.getProtocol(), url.getHost(), url.getFile(), null).toURL();  
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();

أحصل على استثناء Java.io.filenotfound للملفhttp://www.shefinds.com/files/christian-louboutin-dã.© Colletà © -100-pumps.jpg

ماذا أفعل الخطأ وما هي الطريقة الصحيحة لترميز عنوان URL هذا؟

تحديث:
أنا أستخدم روما لقراءة في موجزات RSS. أخذ اقتراحات من بلدك، قمت بطبعت المدخلات الخام من مراحل مختلفة ويبدو أن محلل ROME RSS يستخدم ISO-8859-1 بدلا من UTF-8.

هل كانت مفيدة؟

المحلول

يعمل بشكل جيد هنا (إرجاع 403، إنه ليس على الأقل 404):

URL url = new URL("http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg");
URLConnection connection = url.openConnection();
InputStream input = connection.getInputStream();

عندما أقوم بإصلاحها بحيث لا ترجع 403، فإن الصورة متقلبة بشكل صحيح:

URL url = new URL("http://www.shefinds.com/files/Christian-Louboutin-Décolleté-100-pumps.jpg");
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/4.0");
InputStream input = connection.getInputStream();
OutputStream output = new FileOutputStream("/pic.jpg");
for (int data = 0; (data = input.read()) != -1;) {
    output.write(data));
}

لذلك فإن مشكلتك تكمن في مكان آخر. التحويل غير مطلوب في الواقع. عنوان URL الأولي صالح.

ربما كنت تحصل على عنوان URL الفعلي من بعض المصادر الثنائية باستخدام ترميز الأحرف الخاطئة؟ انتقال é ل é وهي تقترح أن المصدر الأصلي هو مشفرة UTF-8 وأنه يتم قراءة التعليمات البرمجية بشكل غير صحيح في استخدام ISO-8859-1 بدلا من UTF-8.

تحديث: أو ربما كنت قد فرضته بالفعل في التعليمات البرمجية المصدر Java وحفظ الملف المصدر نفسه باستخدام الترميز الخطأ. لقد قمت بتكوين محرر My (Eclipse) لحفظ الملفات باستخدام UTF-8 و -Dfile.encoding يتعارض أيضا إلى UTF-8، من شأنه أن يفسر السبب إنه يعمل في جهازي ;)

تحديث 2.: حسب التعليقات، باختصار، يجب أن يعمل كل شيء على ما يرام إذا كان الترميز المستخدم لحفظ الملف المصدر يطابق الافتراضي -Dfile.encoding من منصة وقت التشغيل (وترميز الشخصية في السؤال يدعم é). لتجنب الاشتباكات غير المتوقعة كلما أردت توزيع التعليمات البرمجية، فمن الأفضل بالفعل أن تحل محل الأحرف غير المعدنية غير ASCII من قبل Unicode Escapes.

نصائح أخرى

أعتقد أن الإجابة الفنية "لا يمكنك". لا يمكن استخدام أحرف غير ASCII في عنوان URL وفقا للمعيار، وحتى يجب أن يتم الضغط على بعض أحرف ASCII بجميع بناء جملة "٪ XX"، حيث XX هي قيمة ASCII للشخصية.

إذا كان أي شيء، فيمكنك الهروب من "٪" مع "٪ E9" ولكن هذا يعتمد على خادم تفسير هذا كترميز للشخصية وفقا ل ISO-8859-1. في حين أن هذا غير مسموح به من الناحية الفنية، أعتقد أن العديد من الخوادم سوف تفعل ذلك.

ترميز الملف المصدر الخاص بك هو اللوم. باستخدام IDE الخاص بك، اضبطه على UTF-8، ثم أعد إحياء عنوان URL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top