2012-04-02 26 views
7

मैं एक फ़ाइल नाम ज़िप करने कर रहा हूँ अंदर फ़ाइल नाम के लिए यूनिकोड वर्ण का उपयोग Péréquation लेस Hôpitaux NEUFS.xls किसी दूसरे फ़ोल्डर में जैसे कुछ विशेष वर्ण हैं, कहते हैं कि अस्थायीएक ज़िप संग्रह

मैं फ़ाइल को ज़िप करने में सक्षम हूँ लेकिन समस्या यह है फ़ाइल का नाम पी + ¬r + ¬quation लेस Hôpitaux NEUFS.xls के लिए स्वचालित रूप से बदल रहा है है।

मैं ज़िप संग्रह के अंदर फ़ाइल नामों के लिए यूनिकोड वर्णों का समर्थन कैसे कर सकता हूं?

+0

नमस्ते चीनी फ़ाइल नाम ज़िप संपीड़न probem http://stackoverflow.com/a के लिए इसे देखें/21521784/1194578 – mathi

उत्तर

16

यह संग्रह बनाने के लिए आप किस कोड का उपयोग कर रहे हैं इस पर थोड़ा सा निर्भर करता है। पुराना जावा संपीड़न वर्ग आपकी आवश्यकता के अनुसार इतना लचीला नहीं है।

आप Apache Commons Compress का उपयोग कर सकते हैं। ZipOutputStream constructor

बड़ी समस्या पर

ZipArchiveOutputStream ostream = ...; // Your initialization code here 
ostream.setEncoding("Cp437"); // This should handle your "special" characters 
ostream.setFallbackToUTF8(true); // For "unknown" characters! 
ostream.setUseLanguageEncodingFlag(true);        
ostream.setCreateUnicodeExtraFields(
    ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE); 

आप तो आप अंत में एक Charset पैरामीटर जावा 7 उपयोग कर रहे हैं (कि UTF-8 हो सकता है),: Michael Simons कोड के इस अच्छा टुकड़ा लिखा था वैसे भी, यह है कि कई कार्यान्वयन यूनिकोड एन्कोडिंग को नहीं समझते हैं क्योंकि मूल ज़िप फ़ाइल प्रारूप ASCII है और यूनिकोड के लिए कोई आधिकारिक मानक नहीं है। अधिक जानकारी के लिए this post देखें।

+0

मैं ZipOutputStream क्लास का उपयोग कर रहा हूं ... – Maddy

+2

अपनी स्ट्रीम पर सेट सेट एन्कोडिंग ("यूटीएफ -8") या इसे फ़ाइलऑटपुटस्ट्रीम कन्स्ट्रक्टर के पैरामीटर के रूप में प्रदान करें। वैसे भी जवाब में उल्लिखित संगतता मुद्दों को मत भूलना! –

+0

आयात java.util.zip.ZipOutputStream आयात करें; वह पैकेज है जिसका मैं उपयोग कर रहा हूं जो सेट एन्कोडिंग ("यूटीएफ -8") – Maddy

6

ज़िप विनिर्देश (ऐतिहासिक रूप से) निर्दिष्ट नहीं है कि एम्बेडेड फ़ाइल नामों और टिप्पणियों के लिए कौन सी वर्ण एन्कोडिंग का उपयोग किया जाए, मूल आईबीएम पीसी वर्ण एन्कोडिंग सेट, जिसे आमतौर पर आईबीएम कोड पृष्ठ 437 के रूप में जाना जाता है, केवल एकमात्र माना जाता है एन्कोडिंग समर्थित है। जार विनिर्देश इस बीच स्पष्ट रूप से यूटीएफ -8 का उपयोग एन्कोडिंग के रूप में निर्दिष्ट करता है ताकि जार फ़ाइलों में सभी फ़ाइल नामों और टिप्पणियों को एन्कोड और डीकोड किया जा सके। हमारे java.util.jar और java.util.zip कार्यान्वयन के लिए जार/ज़िप फ़ाइलों में संग्रहीत फ़ाइल नामों और टिप्पणियों से निपटने के दौरान यूटीएफ -8 को एकमात्र एन्कोडिंग के रूप में उपयोग करने के लिए जार विनिर्देश का कड़ाई से पालन किया गया।

परिणाम? "पारंपरिक" ज़िप उपकरण द्वारा बनाई गई ज़िप फ़ाइल java.util.jar/ज़िप आधारित उपकरण के लिए सुलभ नहीं है, और इसके विपरीत, यदि फ़ाइल नाम में वर्ण हैं जो सीपी 437 के बीच संगत नहीं हैं (वैकल्पिक रूप से, उपकरण बस उपयोग कर सकते हैं डिफ़ॉल्ट प्लेटफॉर्म एन्कोडिंग) और यूटीएफ -8

अधिकांश यूरोपीय लोगों के लिए, आप "भाग्यशाली" हैं :-) कि आपको केवल "मुट्ठी भर" पात्रों से बचने की ज़रूरत है, जैसे उमलॉट्स (ठीक है, मैं बस मजाक कर रहा हूं), लेकिन जापानी और चीनी के लिए, अधिकांश पात्र भाग्य से बाहर हैं। यही कारण है कि बग 424449 9 इतने सालों से शीर्ष 25 जावा बग्स पर नंबर 1 रहा था। बग अब सूची में नहीं है :-) यह अंततः ओपनजेडीके 7, बी 57 में "निश्चित" हो गया है। मैं अभी भी अपने लिए रिकॉर्ड/कुडो के रूप में एक स्नैपशॉट रखता हूं :-)

जेडीके 7 बी 57 में समाधान (मैं "फिक्स" से "समाधान" का उपयोग करता हूं) ZipInputStream ZipOutStream और ZipFile रचनाकारों के एक नए सेट में पेश करना है जैसा कि नीचे दिखाया गया है, पैरामीटर के रूप में एक विशिष्ट "वर्णमाला" के साथ।

zipfile (फ़ाइल, वर्णसेट)

ZipInputStream (InputStream, वर्णसेट)

ZipOutputStream (OutputStream, वर्णसेट)

इन नए कंस्ट्रक्टर्स साथ

, आवेदन अब उन तक पहुँच सकते हैं गैर-यूटीएफ -8 ज़िप फाइलें ZipInputStream या ZipFile ऑब्जेक्ट्स के माध्यम से विशिष्ट एन्कोडिंग के साथ बनाई गई हैं, या नए ZipOutputStream (os, c के माध्यम से गैर-यूटीएफ -8 में एन्कोड किए गए ज़िप फ़ाइलों को बनाते हैं। हरसेट) कन्स्ट्रक्टर, यदि आवश्यक हो।

ज़िप जार टूल का एक पट्टी-डाउन संस्करण है जो "एन्कोडिंग" विकल्प के साथ प्रवेश नाम और टिप्पणी के लिए गैर-यूटीएफ 8 एन्कोडिंग का समर्थन करने के लिए है, यह नए एपीआई का उपयोग करने के लिए डेमो के रूप में कार्य कर सकता है (मैंने उपयोग किया यह एक इकाई परीक्षण के रूप में)। मैं अभी भी अपने आप से बहस कर रहा हूं अगर आधिकारिक तौर पर जार टूल में "-कोडिंग" शुरू करना अच्छा विचार है ...

+0

मैं जावा 6 का उपयोग कर रहा हूँ :) – Maddy

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