2011-02-11 10 views
73

İnternet üzerinden hat üzerinden text/plain dosyasından okumaya çalışıyorum. Şu anda var kodudur:InputFlash'u UTF-8 olarak okuma

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

dosya, test.txt, ben kodlama test etmek için kullanıyorum ¡Hélló! içerir.

OutputStream'u (out) incelediğimde, onu > ¬°H√©ll√≥! olarak görüyorum. OutputStream ile ilgili bir sorun olduğuna inanmıyorum çünkü out.println("é");'u sorunsuz yapabilirim.

Okuma için herhangi bir fikir InputStream'u UTF-8 olarak mı oluşturur? Teşekkürler!

+1

HTTP protokolü kodlamayı belirtir. Neden sizin için işleyen bir kitaplık API'sı kullanmıyorsunuz? Bunun gibi kodlamayı asla tahmin etmemelisiniz. Olumsuz olmak istemiyorum: harika gidiyorsunuz! Sadece daha kolay bir yol olup olmadığını merak ediyorum. – tchrist

+1

Maalesef 'text/plain' dosyasına hizmet veren sunucuya erişemiyorum ve UTF-8 kodlaması kullanmıyor. İyi bir ağ kütüphanesinin farkında değildim; baska öneri? –

+1

[docs] 'a (http://download.oracle.com/javase/6/docs/api/java/net/URL.html) bakarak, kodlamayı hiç belirtmeniz gerekmeyeceğini düşünmüyorum. Sana bayt akışı vermelerine şaşırdım! İçerik Kodlaması’nı kontrol edebileceğiniz, sonra da bir Açma [URLConnection] 'a (http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html) erişebilirsiniz. Doğru argüman ile InputStreamReader. Kaynağın hızlı bir şekilde kontrol edilmesi, sizin için uygun görünen herhangi bir şey ortaya çıkarmaz, bu oldukça rahatsızlık verici ve hataya eğilimli gözükür, bu yüzden muhtemelen bir şeyleri özlüyorum. – tchrist

cevap

146

Kendi sorunumu çözdüm. Bu hat:

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

ihtiyacı olması:

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

veya Java beri 7:

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

Yapıcının formunun geçersiz girişte bir istisna getirmeyeceğinden eminim. Bir CharsetDecoder dec' argümanı ile kullanmanız gerekir. Bu, “OutputStreamWriter” yapıcılarının sahip olduğu Java tasarım hatasıdır: dörtten sadece biri, bir şeylerin yanlış gittiği zaman size söyleyeceğimizi gösterir. Yine orada da 'CharsetDecoder dec' argümanını kullanmalısın. Yapılması gereken tek güvenli ve akılcı şey, diğer tüm kurucuları göz ardı etmemek, çünkü davranacakları için güvenilmezler. – tchrist

+1

İyi bahşiş, teşekkürler. –

+5

Java 7'den itibaren, Charset'in bir String olarak değil, bir Standart olarak “Sabit Standart”, “StandardCharsets.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) { 

    } 

bu deneyin, .. :-)

+7

olmasını sağlamanız mümkündür. + = Str dosyası yerine, bir StringBuilder oluşturun ve buna ekleyin. Derleyici eki dizgiyi en iyi duruma getirebilir, ancak büyük olasılıkla bir çok çöpün yaratılması olasıdır. – seand

+1

Bir BufferedReader'ı bir dizeye dönüştürmek istiyorsanız, Apache Commons'ı kullanın, tılsımı yeniden keşfetmeyin: String myStr = org.apache.commons. io.IOUtils.toString (myBufferedReaderInstance); –

+1

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

0

koştum Özel bir karakter her bulduğunda aynı soruna it olarak işaretler. ISO-8859-1

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

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

} 

Ben bunun bu yazıyı gören herkesi yardımcı olabilir umut: Bu çözmek için, ben kodlama kullanarak çalıştı.