كيفية عرض اسم ملف غير ascii في مربع تنزيل الملف في المتصفحات؟

StackOverflow https://stackoverflow.com/questions/149058

  •  02-07-2019
  •  | 
  •  

سؤال

لا يبدو أن هناك طريقة مقبولة لإرسال معلمة رأس بتنسيق غير ascii.

عادةً ما يبدو رأس تنزيل الملف كما يلي

التصرف في المحتوى:مرفق؛اسم الملف = "theasciifilename.doc"

إلا إذا قمت بتحطيم سلسلة مشفرة بـ utf8 في معلمة اسم الملف، فسيتعامل معها Firefox بشكل جيد، بينما سوف يتقيأ IE.

هناك مستند على CodeProject يشرح طريقة تشفير اسم الملف.

يقوم هذا المستند بتشفير Bản Kiểm Kê.doc إلى B%e1%ba%a3n%20Ki%e1%bb%83m%20K%c3%aa.doc عن طريق التشفير السداسي للبايتات.

المشكلة رقم 1:الحرف الأول في تلك السلسلة:ả لها قيمة ả -- قم بتشفير هذا الرقم بالصيغة السداسية وستحصل على %a3%1e.كيف حصل هذا الرجل على %e1%ba%a3؟(من الواضح أنني أفتقد شيئًا بسيطًا هنا)

المشكلة رقم 2:بينما يتعرف IE على هذا التشفير، فإن Firefox لا يفعل ذلك!ما يجب القيام به؟

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

المحلول

إجابة السؤال رقم 1:أنت تخلط بين Unicode وUTF-8.القيمة السداسية لـ 'ả' هي 0xA31E ولكن هذا ليس حرف UTF-8.في UTF-8 يتطلب هذا الحرف ثلاثة بايت، 0xE1 0xBA 0xA3.تم تعريف ترميز URL بشكل سيئ للترميزات غير ascii ولكن %e1%ba%a3 هو ترميز UTF-8 الصالح الذي يجب استخدامه لهذا الحرف.

نصائح أخرى

المواصفات لا تسمح بشكل أساسي بأي شيء آخر غير US-ASCII.رؤوس HTTP هي US-ASCII.تكون حمولة HTTP الافتراضية هي ISO 8859-1 ولكن هذا يشير إلى نص المحتوى، وليس الرؤوس.

يمكن القول إن الشيء الصحيح الذي ينبغي فعله هو استخدام تقنية MIME لتشفير البيانات غير ASCII في الرؤوس، كما هو موضح في آر إف سي 2047, ولكن ليس لدي أي فكرة عما إذا كانت المتصفحات تدعم ذلك بالفعل.

يحرر: عفوًا، لا، ينص القسم 5 من RFC 2047 صراحةً على أن النموذج المشفر غير مسموح به في التخلص من المحتوى.يبدو أنك لم يحالفك الحظ - لا يوجد معيار.

تحرير 2: هناك معيار - آر إف سي 2231 يحدد كيف من المفترض أن يعمل هذا الآن.وهو يحظى بدعم من بعض المتصفحات، ولكنه غير مدعوم في IE.وجدت بعض حالات الاختبار والتي توضح كيفية عمله والدعم المتوفر للمتصفح.

بالنسبة للمشكلة رقم 2، تحتاج إلى ترميز عنوان URL لاسم الملف لكل من Internet Explorer وFirefox.والفرق الوحيد هو أنك تحتاج إلى استخدام تنسيق RFC 2231 في Firefox.ينطبق هذا على Firefox 3 وInternet Explorer 7.

في الرابط أعلاه، e1 ba a3 هو ترميز UTF-8 للحرف المذكور، وليس رمز الحرف.

الإجابة (نوعًا ما) على المشكلة رقم 2:

نظرًا لأنك اكتشفت أن نظام التسمية في أحد المتصفحات لا يعمل في المتصفح الآخر، فإن الحل الوحيد أمامك هو القيام بذلك بشكل مختلف لكل متصفح، كما هو موضح في المثال هنا.

في حالة اختفاء الرابط، الحل هو:

1. If browser is IE URL encode filename
2. Generate Content-disposition header

بالطبع تحديد ما إذا كان المتصفح IE بواسطة User-agent (وهي الطريقة الوحيدة التي يمكنك من خلالها القيام بذلك) محفوف بجميع أنواع المخاطر المعتادة.

كما يبدو هذا الأمر متمركزًا في أمريكا الشمالية، إذا كان من المهم أن يعمل هذا في عدد كبير من المتصفحات التي لا تتحكم فيها والتي قد يتم حظر وكيل المستخدم أو تعديلها، فما عليك سوى تجنب الأحرف المشفرة UTF-8 في اسم الملف ودائمًا استخدم "تنزيل" أو شيء من هذا.

لسوء الحظ، لا توجد حاليًا طريقة واحدة تعمل في جميع وكلاء المستخدم.

يرى http://greenbytes.de/tech/tc2231/ لحالات الاختبار، ثم قم بتقديم شكوى إلى Microsoft وGoogle وApple.

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