2011-11-29 15 views
10

मुझे स्ट्रीम से एन्कोडिंग मिलना है।जावा: मैं इनपुटस्ट्रीम से एन्कोडिंग कैसे प्राप्त कर सकता हूं?

पहली विधि - इनपुटस्ट्रीम रीडर का उपयोग करने के लिए।

लेकिन यह हमेशा ओएस एन्कोड लौटाता है।

InputStreamReader reader = new InputStreamReader(new FileInputStream("aa.rar")); 
System.out.println(reader.getEncoding()); 

उत्पादन: GBK

2 विधि - UniversalDetector उपयोग करने के लिए।

लेकिन यह हमेशा शून्य हो जाता है।

FileInputStream input = new FileInputStream("aa.rar"); 

    UniversalDetector detector = new UniversalDetector(null); 
    byte[] buf = new byte[4096]; 

    int nread; 
    while ((nread = input.read(buf)) > 0 && !detector.isDone()) { 
     detector.handleData(buf, 0, nread); 
    } 

    // (3) 
    detector.dataEnd(); 

    // (4) 
    String encoding = detector.getDetectedCharset(); 

    if (encoding != null) { 
     System.out.println("Detected encoding = " + encoding); 
    } else { 
     System.out.println("No encoding detected."); 
    } 

    // (5) 
    detector.reset(); 

उत्पादन: अशक्त

कैसे मैं सही मिल सकता है? :(

+4

इनपुटस्ट्रीम रीडर हमेशा प्लेटफ़ॉर्म एन्कोडिंग का उपयोग करेगा। यह फाइलों में एन्कोडिंग का पता लगाने का प्रयास नहीं करता है। यूनिवर्सलडिएक्टर के माध्यम से आप किस प्रकार की फाइलें चला रहे हैं? आपके उदाहरण में आपने एक आरएआर फ़ाइल का उपयोग किया, जो एक संपीड़ित बाइनरी प्रारूप है। पहले एक साधारण ASCII पाठ फ़ाइल के साथ प्रयास करें। – prunge

+0

नमस्ते, मुझे फ़ाइल प्रकार, 'Fortunes.txt' आउटपुट बदल दिया गया है: कोई एन्कोडिंग नहीं मिली –

+0

यह बीओएम के बिना 'मानक' यूटीएफ -8 या यूटीएफ -16 का पता लगाना प्रतीत नहीं होता है, लेकिन यह यूटीएफ -16 के लिए काम करता है मेरे लिए एक बीओएम के साथ। शायद वर्णमाला पहचान के लिए एक अलग पुस्तकालय का उपयोग करने पर विचार करें? [यह लिंक] (http://stackoverflow.com/questions/499010/java-how-to-determine-the-correct-charset-encoding-of-a-stream) मदद कर सकता है। – prunge

उत्तर

5

की स्थिति को फिर से शुरू करते हैं:

  • InputStream बाइट्स
  • * पाठकों कुछ एन्कोडिंग में वर्ण देने बचाता है
  • नई InputStreamReader (InputStream) ऑपरेटिंग सिस्टम एन्कोडिंग
  • नई InputStreamReader का उपयोग करता है (InputStream , "यूटीएफ -8") दिए गए एन्कोडिंग का उपयोग करता है (यहां यूटीएफ -8)

तो किसी को भी अब पढ़ने से पहले एन्कोडिंग। आपने पहली बार एक वर्णमाला पहचान वर्ग का उपयोग करके सब ठीक किया।

पढ़ना http://code.google.com/p/juniversalchardet/ इसे यूटीएफ -8 और यूटीएफ -16 को संभालना चाहिए। आप एन्कोडिंग को सत्यापित करने के लिए संपादक जेडिट का उपयोग कर सकते हैं, और देख सकते हैं कि कुछ समस्या है या नहीं।

+0

हम प्राप्त करने के लिए अन्य टूल्स का उपयोग कर सकते हैं, लेकिन यह विशिष्ट उपचार विधि को समझ नहीं सकता है, इससे निपटने के लिए लगता है। :( –

0
public String getDecoder(InputStream inputStream) { 

    String encoding = null; 

    try { 
     byte[] buf = new byte[4096]; 
     UniversalDetector detector = new UniversalDetector(null); 
     int nread; 

     while ((nread = inputStream.read(buf)) > 0 && !detector.isDone()) { 
      detector.handleData(buf, 0, nread); 
     } 

     detector.dataEnd(); 
     encoding = detector.getDetectedCharset(); 
     detector.reset(); 

     inputStream.close(); 

    } catch (Exception e) { 
    } 

    return encoding; 
} 
संबंधित मुद्दे