2011-02-11 23 views
73

के रूप में इनपुटस्ट्रीम पढ़ना मैं इंटरनेट पर लाइन-दर-लाइन text/plain फ़ाइल से पढ़ने की कोशिश कर रहा हूं। कोड मैं अभी है:यूटीएफ -8

URL url = new URL("http://kuehldesign.net/test.txt"); 
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
LinkedList<String> lines = new LinkedList(); 
String readLine; 

while ((readLine = in.readLine()) != null) { 
    lines.add(readLine); 
} 

for (String line : lines) { 
    out.println("> " + line); 
} 

फ़ाइल, test.txt, ¡Hélló!, जो मैं आदेश एन्कोडिंग का परीक्षण करने में उपयोग कर रहा हूँ में शामिल है।

जब मैं OutputStream (out) की समीक्षा करता हूं, तो मुझे इसे > ¬°H√©ll√≥! के रूप में देखा जाता है। मुझे विश्वास नहीं है कि यह OutputStream के साथ एक समस्या है क्योंकि मैं बिना किसी समस्या के out.println("é"); कर सकता हूं।

InputStream को यूटीएफ -8 के रूप में पढ़ने के लिए कोई विचार? धन्यवाद!

+1

HTTP प्रोटोकॉल एन्कोडिंग निर्दिष्ट करता है। आप लाइब्रेरी एपीआई का उपयोग क्यों नहीं कर रहे हैं जो आपके लिए इसे संभालता है? आपको इस तरह एन्कोडिंग का अनुमान लगाना नहीं चाहिए। मेरा नकारात्मक मतलब नहीं है: आप बहुत अच्छा कर रहे हैं! मुझे आश्चर्य है कि क्या कोई आसान तरीका नहीं है। – tchrist

+1

मुझे उस सर्वर तक पहुंच नहीं होगी जो 'टेक्स्ट/सादा' फ़ाइल की सेवा कर रही है, दुर्भाग्य से, और यह यूटीएफ -8 एन्कोडिंग का उपयोग नहीं कर रहा है। मुझे किसी भी अच्छे नेटवर्क पुस्तकालयों से अवगत नहीं था; कोई सुझाव? –

+1

[डॉक्स] (http://download.oracle.com/javase/6/docs/api/java/net/URL.html) को देखते हुए, मुझे नहीं लगता कि आपको एन्कोडिंग बिल्कुल निर्दिष्ट करना होगा। मुझे आश्चर्य है कि वे आपको एक बाइट स्ट्रीम देते हैं! आपके पास अंतर्निहित [URLConnection] (http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html) तक पहुंच है, जिससे आप सामग्री-एन्कोडिंग की जांच कर सकते हैं, फिर एक खोलें सही तर्क के साथ इनपुटस्ट्रीम रीडर। स्रोत की एक त्वरित जांच कुछ भी नहीं बदली है जो आपके लिए ऐसा लगता है, जो कि बहुत कमजोर लंगड़ा और त्रुटि प्रवण प्रतीत होता है, इसलिए शायद मुझे कुछ याद आया। – tchrist

उत्तर

146

मेरी अपनी समस्या का हल। यह पंक्ति:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 

जरूरतों होने के लिए:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 

या जावा के बाद से 7:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); 
+3

मुझे पूरा यकीन है कि निर्माता का रूप अमान्य इनपुट पर अपवाद नहीं उठाएगा। आपको 'CharsetDecoder dec' तर्क के साथ उपयोग करने की आवश्यकता है। यह वही जावा डिज़ाइन बग है जो 'आउटपुटस्ट्रीमवाइटर 'रचनाकारों के पास है: केवल चार में से एक वास्तव में आपको बताता है कि कुछ गलत होने पर आपको बताता है। आपको फिर भी फैंसी 'चार्सेट डिकोडर डीसी' तर्क का उपयोग करना होगा। करने के लिए एकमात्र सुरक्षित और सौहार्दपूर्ण बात यह है कि अन्य सभी रचनाकारों को बहिष्कृत किया जाना चाहिए, क्योंकि उन्हें व्यवहार करने पर भरोसा नहीं किया जा सकता है। – tchrist

+1

अच्छी टिप, धन्यवाद। –

+5

जावा 7 के बाद से चार्टसेट को एक कॉन्स्टेंट के रूप में एक स्टिंग 'मानकCharsets.UTF_8' – tobijdc

13
String file = ""; 

    try { 

     InputStream is = new FileInputStream(filename); 
     String UTF8 = "utf8"; 
     int BUFFER_SIZE = 8192; 

     BufferedReader br = new BufferedReader(new InputStreamReader(is, 
       UTF8), BUFFER_SIZE); 
     String str; 
     while ((str = br.readLine()) != null) { 
      file += str; 
     } 
    } catch (Exception e) { 

    } 

इस प्रयास करें, .. :-)

+7

फ़ाइल + = str के बजाय, स्ट्रिंगबिल्डर बनाने और उसमें संलग्न करने के लिए लिखना संभव है। कंपाइलर स्ट्रिंग एपेंडिंग को अनुकूलित करने में सक्षम हो सकता है, लेकिन संभवतः यह बहुत सारे कचरे को बना रहा है – seand

+1

यदि आप एक बुफर्ड रीडर को स्ट्रिंग में कनवर्ट करना चाहते हैं, तो अपाचे कॉमन्स का उपयोग करें, व्हील को दोबारा न बदलें: स्ट्रिंग myStr = org.apache.commons। io.IOUtils.toString (myBufferedReaderInstance); –

+1

यूटीएफ 8 = "utf8", अच्छा चर;) – Nicofisi

0

मैं भाग गया एक ही समस्या में हर बार जब यह एक विशेष चरित्र पाता है तो इसे के रूप में चिह्नित करता है। आईएसओ-8859-1

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1")); 

while ((line = br.readLine()) != null) { 

} 

मुझे आशा है कि यह जो इस पोस्ट को देखता है किसी को मदद कर सकते हैं: इस को हल करने के, मैं एन्कोडिंग का उपयोग करने की कोशिश की।

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