La lectura de InputStream como UTF-8

Estoy tratando de leer de un text/plain de archivos a través de internet, línea por línea. El código que tengo ahora es:

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

El archivo, test.txt, contiene ¡Hélló!, que estoy utilizando en el fin de probar la codificación.

Cuando reviso el OutputStream (out), yo lo veo como > ¬°H√©ll√≥!. Yo no creo que esto sea un problema con el OutputStream desde que puedo hacer out.println("é"); sin problemas.

Ideas para la lectura de la forma de la InputStream como UTF-8? Gracias!

  • El protocolo HTTP especifica la codificación. Por qué no vas a usar una biblioteca de API que se encarga de eso para usted? Usted nunca debería tener que adivinar la codificación como este. No quiero ser negativa: lo estás haciendo muy bien! Me pregunto si no hay una manera más fácil.
  • No tengo acceso al servidor que es el que sirve a la text/plain archivo, por desgracia, y no mediante una codificación UTF-8. Yo no era consciente de cualquier bien de la red de bibliotecas; alguna sugerencia?
  • Buscando en la docs, yo no creo que se tendría que especificar el tipo de codificación. Estoy sorprendido de que le den un flujo de bytes! Usted tiene acceso a los URLConnection, desde donde se puede comprobar la Codificación de Contenido, a continuación, abra un InputStreamReader con el argumento correcto. Una comprobación rápida de la fuente no se enciende nada de lo que parece a hacer por usted, que parece bastante darned cojo y propenso a errores, así que probablemente me faltó algo.
InformationsquelleAutor Chris Kuehl | 2011-02-11

3 Kommentare

  1. 176

    Resuelto mi problema. Esta línea:

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

    debe ser:

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

    o desde Java 7:

    BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
    • Estoy bastante seguro de que la forma de que el constructor no elevará una excepción en la entrada no válida. Usted necesidad de utilizar el con un CharsetDecoder dec argumento. Este es el mismo Java diseño de error que el OutputStreamWriter los constructores tienen: sólo uno de los cuatro realidad condescends a decirle cuando algo va mal. Vuelva a tener el uso de la fantasía CharsetDecoder dec argumento de allí, también. El único seguro y sano cosa a hacer es considerar que todas las demás constructores en desuso, debido a que no se puede confiar en que se comportan.
    • Buen consejo, gracias.
    • Desde Java 7 es posible escribir al proporcionar el conjunto de Caracteres como una Constante no como una Cadena StandardCharsets.UTF_8
  2. 15
    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) {
    
    }

    Probar esta,.. 🙂

    • En lugar de archivo += str, crear un StringBuilder y añadir a eso. El compilador podría ser capaz de para optimizar la cadena de anexar, pero es probable que la creación de un montón de basura
    • Si desea convertir una clases bufferedreader en una cadena, en uso de Apache Commons, no reinventar la roncha: String myStr = org.apache.commons.io.IOUtils.toString( myBufferedReaderInstance);
    • UTF8 = «utf8», agradable variable 😉
  3. 6

    Me encontré con el mismo problema cada vez que se encuentra un carácter especial marca como ��. para solucionar esto, he intentado utilizar el encoding: ISO-8859-1

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));
    
    while ((line = br.readLine()) != null) {
    
    }

    Espero que esto pueda ayudar a cualquier persona que vea este post.

    • Podría por favor explicar lo que los personajes no se admite en UTF-8?

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea