InputStream'i UTF-8 Olarak Okuma


97

text/plainİnternetteki bir dosyadan satır satır okumaya çalışıyorum . Şu anda sahip olduğum kod:

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);
}

Kodlamayı test etmek için kullandığım dosya, test.txtiçerir ¡Hélló!.

OutputStream( out) Öğesini incelediğimde, olarak görüyorum > ¬°H√©ll√≥!. Sorun yaşamadan OutputStreamyapabildiğim için bunun bir sorun olduğuna inanmıyorum out.println("é");.

InputStreamUTF-8 olarak okumak için herhangi bir fikir var mı? Teşekkürler!


1
HTTP protokolü, kodlamayı belirtir. Bunu sizin için halleden bir kütüphane API'sini neden kullanmıyorsunuz? Bu şekilde kodlamayı asla tahmin etmek zorunda kalmamalısınız. Negatif olmak istemiyorum: harikasın! Daha kolay bir yolu olup olmadığını merak ediyorum.
tchrist

1
text/plainDosyayı sunan sunucuya ne yazık ki erişimim olmayacak ve bu bir UTF-8 kodlaması kullanmıyor. İyi bir ağ kitaplığı olduğunun farkında değildim; herhangi bir öneri?
Chris Kuehl

1
Dokümanlara baktığımda , kodlamayı hiç belirtmeniz gerekeceğini düşünmüyorum. Size bir bayt akışı vermelerine şaşırdım! İçeriğin Kodlamasını kontrol edebileceğiniz, ardından doğru bağımsız değişkenle bir InputStreamReader açabileceğiniz temel URLConnection'a erişiminiz vardır . Kaynağın hızlı bir şekilde kontrol edilmesi, sizin için bunu yapıyor gibi görünen hiçbir şeyi ortaya çıkarmaz, ki bu oldukça berbat ve hataya yatkın görünüyor, bu yüzden muhtemelen bir şeyi kaçırdım.
tchrist

Yanıtlar:


192

Kendi sorunumu çözdüm. Bu hat:

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

olması gerekir:

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

veya Java 7'den beri:

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

3
Yapıcının biçiminin geçersiz girişte bir istisna oluşturmayacağından oldukça eminim. With a CharsetDecoder decargüman kullanmanız gerekir . Bu, OutputStreamWriterkurucuların sahip olduğu Java tasarım hatasıyla aynıdır : dört kişiden yalnızca biri, bir şeyler ters gittiğinde size söyleme eğilimindedir. Yine CharsetDecoder decoradaki süslü argümanı kullanmak zorundasın . Yapılması gereken tek güvenli ve mantıklı şey, diğer tüm kurucuları kullanımdan kaldırılmış olarak kabul etmektir çünkü davranışlarına güvenilemezler.
tchrist

7
Java 7'den bu yana, Karakter StandardCharsets.UTF_8
Setini

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

}

Bunu dene,.. :-)


8
+ = Str dosyası yerine, bir StringBuilder oluşturun ve buna ekleyin. Derleyici dizge
eklemeyi

2
Bir BufferedReader'ı bir dizgeye dönüştürmek istiyorsanız, Apache Commons kullanın, kabarcığı yeniden keşfetmeyin: String myStr = org.apache.commons.io.IOUtils.toString (myBufferedReaderInstance);
Jaime Marín

8
UTF8 = "utf8", güzel değişken;)
Nicofisi

8

Özel bir karakterin onu olarak işaretlediğini her bulduğunda aynı problemle karşılaştım. Bunu çözmek için şu kodlamayı kullanmayı denedim: ISO-8859-1

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

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

}

Umarım bu, bu gönderiyi gören herkese yardımcı olabilir.


1
Lütfen UTF-8'de desteklenmeyen karakterlerin ne olduğunu söyleyebilir misiniz?
USM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.