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.