2012-06-30 6 views
5

जावा 7 को यूटीएफ -8 के अलावा चरित्र सेट के साथ अनपॅकिंग ज़िप अभिलेखागार के साथ पुरानी समस्या को ठीक करना है। यह निर्माता ZipInputStream(InputStream, Charset) द्वारा हासिल किया जा सकता है। अब तक सब ठीक है. जब मैं स्पष्ट रूप से एक आईएसओ -885 9 -1 चरित्र सेट सेट करता हूं तो मैं उन में नामों वाले फ़ाइल नाम वाले ज़िप संग्रह को अनपैक कर सकता हूं।ZipInputStream (इनपुटस्ट्रीम, चार्टसेट) डीकोड्स ZipEntry फ़ाइल नाम falsely

लेकिन यहां समस्या है: ZipInputStream.getNextEntry() का उपयोग कर स्ट्रीम पर फिर से चलने पर, प्रविष्टियों के नाम उनके नाम गलत हैं। मेरे मामले में umlaut "ü" को "?" द्वारा प्रतिस्थापित किया गया है चरित्र, जो स्पष्ट रूप से गलत है। क्या कोई जनता है कि यह कैसे ठीक किया जाता है? जाहिर है ZipEntry इसके अंतर्निहित ZipInputStream के Charset को अनदेखा करता है। ऐसा लगता है कि अभी तक एक और ज़िप-संबंधित जेडीके बग है, लेकिन मैं कुछ भी गलत कर रहा हूं।

... 
zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE), 
    Charset.forName("ISO-8859-1") 
); 
while ((zipEntry = zipStream.getNextEntry()) != null) { 
    // wrong name here, something like "M?nchen" instead of "München" 
    System.out.println(zipEntry.getName()); 
    ... 
} 
+0

जावा एसई 6 के लिए सर्वोत्तम प्रथाएं क्या हैं? (SE7 के लिए अपग्रेड करने के अलावा :) – basZero

+0

एसई 6 के लिए: मैंने VM पैरामीटर 'zip.altEncoding' या 'zip.encoding' को' cp437' या' ISO-8859-1' पर सेट करने का परीक्षण किया, दोनों सही ढंग से पढ़ने में मदद नहीं करते – basZero

+0

@ बेसझेरो: अपाचे कॉमन्स संपीड़न अच्छी तरह से काम करता है। हालांकि मुझे कोई आउट ऑफ़ द बॉक्स समाधान नहीं मिला। – kriegaex

उत्तर

6

OMG, मैं दो या तो घंटे के लिए चारों ओर खेला, लेकिन सिर्फ पांच मिनट के बाद मैं अंत में यहाँ प्रश्न पोस्ट, मैं जवाब टकरा: मेरी ज़िप फ़ाइल ISO-8859-1 के साथ इनकोडिंग नहीं किया गया था, लेकिन सीपी 437 के साथ। तो कन्स्ट्रक्टर कॉल होना चाहिए:

zipStream = new ZipInputStream(
    new BufferedInputStream(new FileInputStream(archiveFile), BUFFER_SIZE), 
    Charset.forName("Cp437") 
); 

अब यह एक आकर्षण की तरह काम करता है। वैसे भी आपको परेशान करने के लिए खेद है। मुझे उम्मीद है कि यह किसी और को समान समस्याओं का सामना करने में मदद करता है।

+0

मुझे लगता है कि आप इस उत्तर को सही मानते हैं, भले ही आपने इसे स्वयं लिखा है, इस लेख के अनुसार: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your- खुद-प्रश्न / – seh

संबंधित मुद्दे