इनपुटस्ट्रीम को UTF-8 के रूप में पढ़ना


96

मैं text/plainइंटरनेट पर एक फ़ाइल से पढ़ने की कोशिश कर रहा हूँ , लाइन-बाय-लाइन। मेरे पास अभी जो कोड है वह है:

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("é");समस्याओं के बिना कर सकता हूं ।

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


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

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

1
डॉक्स को देखते हुए , मुझे नहीं लगता कि आपको एन्कोडिंग बिल्कुल निर्दिष्ट करना होगा। मुझे आश्चर्य है कि वे आपको एक बाइट स्ट्रीम देते हैं! आपके पास अंतर्निहित URLConnection तक पहुंच है , जिसमें से आप सामग्री-एन्कोडिंग की जांच कर सकते हैं, फिर सही तर्क के साथ एक InputStreamReader खोलें। स्रोत की एक त्वरित जाँच कुछ भी ऐसा नहीं करती है जो आपको लगता है कि आपके लिए है, जो कि बहुत कम लंगड़ा और त्रुटि प्रवण लगता है, इसलिए मुझे शायद कुछ याद नहीं है।
1

जवाबों:


189

मेरी अपनी समस्या का समाधान किया। यह रेखा:

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तर्क के साथ उपयोग करने की आवश्यकता है । यह वही जावा डिज़ाइन बग है जो OutputStreamWriterकंस्ट्रक्टरों के पास है: चार में से केवल एक वास्तव में आपको यह बताने के लिए कृपालु करता है कि कुछ गलत हो जाता है। आपको फिर से CharsetDecoder decवहां भी फैंसी तर्क का उपयोग करना होगा। केवल सुरक्षित और समझदार बात यह है कि सभी अन्य निर्माणकर्ताओं को पदावनत करने पर विचार किया जाए, क्योंकि उन्हें व्यवहार करने के लिए भरोसा नहीं किया जा सकता है।
1

6
जावा 7 के बाद से चारसेट को कॉन्स्टेंट के रूप में एक स्ट्रिंग के रूप में नहीं लिखना संभव हैStandardCharsets.UTF_8
Tobijdc

18
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) {

}

इसे इस्तेमाल करे,.. :-)


8
फ़ाइल + = str के बजाय, एक StringBuilder बनाएँ और उस पर संलग्न करें। संकलक स्ट्रिंग को अनुकूलित करने में सक्षम हो सकता है, लेकिन यह बहुत अधिक कचरा पैदा करने की संभावना है
सीज़न

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

8
UTF8 = "utf8", अच्छा चर;)
निकोफिसी

7

मैं हर बार एक ही समस्या में भाग गया, यह एक विशेष चरित्र को a के रूप में चिह्नित करता है। इसे हल करने के लिए, मैंने एन्कोडिंग का उपयोग करने की कोशिश की: ISO-8859-1

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

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

}

मुझे उम्मीद है कि यह इस पोस्ट को देखने वाले किसी भी व्यक्ति की मदद कर सकता है।


1
क्या आप बता सकते हैं कि UTF-8 में कौन से वर्ण समर्थित नहीं हैं?
यूएसएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.