2013-11-15 4 views
8

में जर्मन अक्षरों और एन्कोडिंग में मेरे पास एक अनजिपिंग फ़ंक्शन है, और मैं यह सुनिश्चित करने के लिए System.Text.Encoding का उपयोग कर रहा हूं कि निकालने वाली फ़ाइलों को निष्कर्षण के बाद समान नाम रखें क्योंकि आम तौर पर जिन फ़ाइलों को मैं अनजिप कर रहा हूं उनमें जर्मन अक्षरों हैं।
मैं Encoding.Default या Encoding.UTF8 की तरह अलग अलग बातें की कोशिश की लेकिन कुछ भी नहीं काम करता है äÄéöÖüß.txt„Ž‚”™á.txt में परिवर्तित हो जाता या डिफ़ॉल्ट के मामले में यह ब्लैक बॉक्स है:/सी #

किसी भी सुझाव?

using (ZipArchive archive = System.IO.Compression.ZipFile.Open(ZipFile, ZipArchiveMode.Read, System.Text.Encoding.Default)) 
{ 

    foreach (ZipArchiveEntry entry in archive.Entries) 
    { 
     string fullPath = Path.Combine(appPath, entry.FullName); 
     if (String.IsNullOrEmpty(entry.Name)) 
     { 
      Directory.CreateDirectory(fullPath); 
     } 
     else 
     { 
      if (!entry.Name.Equals("Updater.exe")) 
      { 
       entry.ExtractToFile(fullPath,true); 

      } 
     } 
    } 
} 
+0

आप 'UTF32' –

+0

को भी आजमा सकते हैं, यह निर्दिष्ट करते समय त्रुटि देता है" निर्दिष्ट प्रविष्टि नाम समर्थित नहीं है " – eMizo

+0

क्या आप सुनिश्चित हैं कि फ़ाइल नाम कोर्रेक संग्रहीत हैं? अन्य अनजिप प्रोग्राम का उपयोग करके कौन से नाम दिखते हैं? – GvS

उत्तर

6

कोशिश कोडपेज 850 (मेरे लिए काम किया है):

using (ZipArchive archive = System.IO.Compression.ZipFile.Open(ZipFile, ZipArchiveMode.Read, System.Text.Encoding.GetEncoding(850))) 
{ 
     // .... 

अगली टिप्पणी है कि मुझे सही दिशा में डाल Sharpziplib की (एक प्राचीन संस्करण) से है:

/* Using the codepage 1252 doesn't solve the 8bit ASCII problem :/ 
     any help would be appreciated. 

     // get encoding for latin characters (like ö, ü, ß or ô) 
     static Encoding ecp1252 = Encoding.GetEncoding(1252); 
    */ 

    // private static Encoding _encoding = System.Text.ASCIIEncoding; 
    private static Encoding _encoding = System.Text.Encoding.GetEncoding(850); 

पिछले लाइन मेरा परिवर्तन है, इसे विशेष वर्णों के साथ ज़िप-फाइलों को सही ढंग से पढ़ने के लिए।

+1

850 मेरे लिए भी काम किया, धन्यवाद !! :) – eMizo

+1

बस कुछ नोट: पेज 850 और 1252 कुछ पूरी तरह से अलग (और पूरी तरह से परस्पर विनिमय नहीं) कर रहे हैं। जबरदस्ती कोड पेज मौजूदा ज़िप फ़ाइलें (बनाया भगवान जो देश में जानता है) के साथ संगतता टूट जाएगा और यहां तक ​​कि पूरी तरह से वैध ज़िप फाइलों के साथ (437 कोड पेज चाहिये का उपयोग करके बनाया)। यह उस से मदद मिल सकती है ** खुला उसकी मशीन पर और एक विशिष्ट ज़िप उपयोगिता के साथ बनाया फ़ाइलों ** लेकिन यह वहाँ बाहर अन्य ज़िप के 99% (437, 1252 या UTF8 साथ इनकोडिंग) के साथ विफल होगा। –

+0

1252 SharpZipLib में उल्लेख किया गया था, लेकिन इस्तेमाल कभी नहीं किया। मैंने 850 का उपयोग किया है, और अन्य अनुप्रयोगों से ज़िप फ़ाइलों को पढ़ने में कभी भी कोई समस्या नहीं आई है। मैंने अपने जवाब में पहली वाक्य से 1252 के संदर्भ को हटा दिया। – GvS

10

सब केवल आधिकारिक (मौजूदा नहीं ...) ज़िप प्रारूप यूनिकोड वर्ण (तब आप किसी भी ASCII के अलावा अन्य एन्कोडिंग का उपयोग नहीं कर सकते हैं) की अनुमति नहीं है पहले।

कहा कई उपकरण और पुस्तकालयों आप विभिन्न एन्कोडिंग का उपयोग करने की अनुमति है, लेकिन यह (उदाहरण के लिए यदि आप को डिकोड करने के लिए मजबूर कर रहा UTF8/UTF32 या जो कुछ भी एक फाइल अन्य एन्कोडिंग के साथ इनकोडिंग कोशिश) विफल हो सकता है।

फ़ाइल नाम ASCII में एन्कोड किया गया है, तो यह आपके सिस्टम के कोड पृष्ठ मिलेगा:

प्रविष्टि ऐसे नाम हैं जो केवल ASCII वर्ण हो के लिए, भाषा एन्कोडिंग ध्वज सेट है, और मौजूदा सिस्टम डिफ़ॉल्ट कोड पृष्ठ का उपयोग एंट्री नामों को एन्कोड करने के लिए किया जाता है।

आपके पास इस विषय के बारे में .NET कक्षाओं के साथ इतना बड़ा नियंत्रण नहीं है। लेकिन यदि आप एन्कोडिंग निर्दिष्ट नहीं करते हैं तो आपको डिफ़ॉल्ट व्यवहार (ASCII के बाहर कोड के लिए यूटीएफ 8 और ASCII के लिए वर्तमान कोड पेज) मिलेगा। अधिकांश बार यह काम करता है (यदि एक ही कोड पेज के भीतर दोनों एन्कोडिंग और डिकोडिंग किया गया है)।

इससे कैसे बचें? यह आसान नहीं है (क्योंकि हम एक मानक की कमी है), लेकिन संक्षेप में प्रस्तुत करने:

  • एन्कोडिंग मजबूर मत करो (जब तक आप ज़िप फ़ाइल लेने जाएगा तो आप उसे ज्ञात एन्कोडिंग के साथ तो ज़िप किया गया)।
  • अधिकांश मामलों में डिफ़ॉल्ट व्यवहार बहुत अच्छा है।
  • एएससीआईआई एन्कोडेड ज़िपों के लिए विस्तारित वर्ण सिस्टम कोड पृष्ठ पर निर्भर है (यह दोनों प्रणालियों में समान होना चाहिए)।
  • उपयोगकर्ता को एन्कोडिंग बदलने के लिए एक तरीका प्रदान करें (आप ज़िप उपयोगिता द्वारा उपयोग किए जाने वाले एन्कोडिंग की जांच नहीं कर सकते हैं और इसके बारे में कोई मानक नहीं है)। इसका मतलब न केवल एन्कोडिंग (यूटीएफ 8/यूटीएफ 16 या जो कुछ भी) को बदलने के लिए है, लेकिन कोड पेज भी (यदि वे मेल नहीं खाते हैं)। GetEncoding फ़ंक्शन आपको निर्दिष्ट कोड पृष्ठ के लिए सही एन्कोडर देगा)।

सर्वश्रेष्ठ संकेत मैं आपको दे सकता हूं? डिफ़ॉल्ट व्यवहार पर निर्भर (यह बहुत आम है) लेकिन अगर आप को अधिकांश ज़िपों के साथ संगत होने की आवश्यकता है, तो आपके उपयोगकर्ताओं को इसे बदलने के लिए एक तरीका प्रदान करें (क्योंकि प्रत्येक को एक अलग तरीके से कार्यान्वित किया जा सकता है) न केवल एन्कोडिंग के लिए बल्कि कोड पेज भी। विशेष रूप से इसे जर्मन विशिष्ट कोड पृष्ठ के साथ कोड से मजबूर नहीं करें क्योंकि यह आपके द्वारा संभाले जाने वाले पहले स्पेनिश/फ़्रेंच/इतालवी/डच फ़ाइल के साथ टूट जाएगा (और उनके लिए एक सामान्य कोड पृष्ठ नहीं है)।

बीटीडब्ल्यू अगर आप गलत एन्कोडिंग (कोड पृष्ठ नहीं) वाली फाइल खोलते हैं तो विभिन्न अपवादों को संभालने के लिए तैयार रहें।भविष्य पाठकों (टिप्पणियों से) के लिए

संपादन: सी.पी. 850 कैच आम पश्चिमी यूरोप पात्रों में से अधिकांश लेकिन यह यूरोप के लिए कोड पृष्ठ नहीं है। इसकी तुलना करें, उदाहरण के लिए, पूर्वी यूरोप भाषाओं या नार्वेजियन के साथ। यह उनसे मेल नहीं खाता है (और उस भाषा में 33-127 रेंज के बाहर के पात्र बहुत सुंदर हैं क्योंकि वे बॉक्स ड्राइंग नहीं कर रहे हैं)। सी.पी. 850 (Ê उदाहरण के लिएı) से कुछ पात्र में उपलब्ध नहीं हैं सी.पी. 865 (Norsk भाषा के लिए) (मान लें)।

मुझे एक उदाहरण के साथ स्पष्ट करने दें। आपके पास इस नाम के साथ फ़ाइल नाम (Trukey से) है: "Garip Dosya Adı.txt"। अंतिम चरित्र में सीपी 857 (तुर्की के लिए) पर कोड 141 है। यदि आप सीपी 850 का उपयोग कर रहे हैं तो आपको "ı की बजाय मूल सीपी 850 में कोड 213 है। मैं पूर्व पूर्वी भाषाओं का भी उल्लेख नहीं करूंगा (क्योंकि एक निश्चित कोड पृष्ठ भी गन्दा बना देगा यदि आप यूरोप तक सीमित हैं)। यही कारण है कि आप एक निश्चित कोड पृष्ठ सेट नहीं कर सकते हैं जब तक कि आप अपने स्वयं के उपयोग के लिए एक छोटी उपयोगिता लिख ​​रहे हों।

+0

आपके स्पष्टीकरण के लिए धन्यवाद :) वास्तव में उपयोगी है कि विशेष रूप से मेरे पास इस विषय के बारे में बहुत कम ज्ञान है :) धन्यवाद! – eMizo

+0

एक आखिरी सवाल, मेरे मामले में कोडपेज 850 काम करता था, लेकिन डिफ़ॉल्ट रूप से मुझे वास्तव में मेरे मामले में समाधान नहीं मिला, क्या यह 850 पर रखना इतना बुरा होगा? – eMizo

+1

@eMizo बेशक ** यह वास्तव में खराब है ** (जब तक कि आप अपने व्यक्तिगत उपयोग ** के लिए ** छोटी उपयोगिता लिख ​​रहे हों)। पृष्ठ 850 में पश्चिमी भाषाओं में उपयोग किए जाने वाले अधिकांश _common_ वर्ण हैं लेकिन ** यह _default_ 437 डॉस कोड पृष्ठ ** नहीं है (जो सिद्धांत रूप में ज़िप प्रारूप का पालन करता है)। इसका मतलब है कि आप जर्मन अक्षरों के साथ अधिकांश फाइलें खोल सकते हैं लेकिन ** यह पूरी तरह से मान्य ज़िप फाइलों के साथ असफल हो जाएगा ** और यह विंडोज 1252 कोड पेज ** के साथ ** पूरी तरह से अलग बात है ** (कई सामान्य उपयोग वर्ण डॉन ' टी मैच)। –