ملفات UNZIP التي تم إنشاؤها باستخدام WinZip مع أسماء ملفات I18N؟

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

سؤال

يقوم الأشخاص هذه الأيام بإنشاء أرشيفات ZIP الخاصة بهم باستخدام WinZip، والتي تسمح بديل (أي غير اللاتينية: السيريلية واليونانية والصينية وتسمية أسماء الملفات).

للأسف، في محاولة لفتح مثل هذا الملف يسبب المتاعب: يونيكس Unzip يخلق الملفات والقمامة المسماة والوجبات مثل "® £ ¤ © ¤ è è". فشل قيادة جافا وجرة بهذه المحفوظات.

هل هناك طريقة رائعة لفتح مثل هذه الملفات برمجيا؟ يونيكس أو جافا.

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

المحلول 2

الحل الذي وجدته: يمكن ل Apache Commons - ضغط فك ضغط مثل هذه المحفوظات على ما يرام، إذا تم توفيرها مع Charback FressBack الصحيح.

نصائح أخرى

dotnetzip. يدعم يونيكود والترميزات التعسفية لأسماء الملفات داخل zipfiles، سواء لقراءة أو كتابة الكود البريدية.

انها مكتبة .NET. لاستخدام UNIX، ستحتاج أحادي كإرسال ما قبل.

إذا تم إنشاء ZipFile بشكل صحيح بواسطة WinZip، وبعبارة أخرى إذا كانت متوافقة مع الرمز البريدي المواصفات من PKWare, ثم لا يوجد عمل خاص تحتاج إلى القيام به لتحديد الترميز في ذلك الوقت الذي تقوم فيه بفكه. وفقا لمواصفات ZIP، هناك نوعان من الترميزات المدعومة المستخدمة لأسماء الملفات في ZipFiles: UTF-8 و IBM437. يتم تحديد استخدام واحد أو آخر من هذه الترميزات في بيانات التعريف الرمز البريدي وأي مكتبة مضغوط يمكن كشف واستخدامه. يكتشف dotnetzip تلقائيا عند قراءة الرمز البريدي متوافق. مثله:

using (var zip = ZipFile.Read("thearchive.zip"))
{
    foreach (var e in zip) 
    {
        // e.FileName refers to the name on the entry
        e.Extract("extract-directory");
    }
} 

هناك برامج الأرشيف التي تنتج العمود الكود الصماء والذي يرمز "غير متوافق" WRT. WinRAR هو واحد - سينشئ الرمز البريدي يحتوي على أسماء الملفات المشفرة في الترميز الافتراضي المستخدمة على الكمبيوتر. في شنغهاي سوف تستخدم CP950، بينما في أيسلندا، شيء آخر، وفي لشبونة، شيء آخر. تتمثل ميزة "عدم الامتثال" هنا هنا في فتح Windows Explorer وأسماء الملفات I18N-IZED في مثلها. بمعنى آخر، غالبا ما يكون "عدم الامتثال" في كثير من الأحيان ما يريده الناس، لأن Windows لا (حتى الآن؟) دعم ملفات ZIP UTF-8.

(يتعين على كل هذا القيام به مع الترميز المستخدم في ZipFile، وليس الترميز المستخدم في الملفات الموجودة في ملف ZIP)

لا يسمح المواصفات الرمز البريدي بمواصفات ترميز نص تعسفي في بيانات التعريف الرمز البريدي. بمعنى آخر، إذا كنت تستخدم CP950 عند إنشاء الرمز البريدي، فاحتياجات منطق الاستخراج الخاص بك "معرفة" لاستخدام CP950 عند الاستخراج - لا يوجد شيء في ملف ZIP يحمل هذه المعلومات. بالإضافة إلى ذلك، بطبيعة الحال، يجب أن تدعم مكتبة ZIP التي تستخدمها إلى استخراج برمجيا الترميزات التعسفية. بقدر ما أعرف، لم تفعل مكتبة Java Zip. dotnetzip يفعل. مثل ذلك:

using (ZipFile zip = ZipFile.Read(zipToExtract,
                                  System.Text.Encoding.GetEncoding(950)))
{
  foreach (ZipEntry e in zip)
  {
     e.Extract(extractDirectory);
  }
} 

يمكن أن تقوم Dotnetzip أيضا بإنشاء ملفات ZIP مع ترميزات تعسفية - صموري "غير متوافق".

Dotnetzip مجاني ومصدر مفتوح.

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