2011-06-04 18 views
7

Así que estoy tratando de hacer que mi programa muestre un archivo de texto con una lista de nombres. Algunos de los nombres tienen caracteres extraños, como Åström.¿Cómo puedo hacer que eclipse imprima caracteres extraños en Unicode?

me han agarrado éstas lista de nombres de una página web que está codificado en "UTF-8", o al menos estoy bastante seguro de que lo hace debido a que la fuente de la página dice

"http-equiv meta = "Content-Type" content = "text/html; charset = UTF-8"/"

Esto es lo que he probado hasta ahora:

public static void write(List<String> list) throws IOException { 
     Writer out = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8"); 
     try { 
      for (int i=0;i<list.size();i++) { 
       try { 
        byte[] utf8Bytes = list.get(i).getBytes("UTF-8"); 
        out.write(new String(utf8Bytes, "UTF-8")); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 

       out.write(System.getProperty("line.separator")); 

      } 
     } 
     finally { 
     out.close(); 
     } 
    } 

y yo soy un poco confundido en cuanto a por qué no está funcionando. El resultado que obtengo es "à ... ström", que es muy extraño.

¿Puede alguien señalarme en la dirección correcta? ¡Gracias!

Y en otra nota relacionada, hay una manera más fácil de escribir una nueva línea en un archivo de texto, además de la torpe

out.write (System.getProperty ("line.separator"));

que tengo? Lo vi en línea en algún lado y funciona, pero me preguntaba si habría una manera más limpia.

+1

¿Qué usa para abrir el archivo cuando lo revisa? Es posible que el programa pueda detectar la codificación errónea. –

+0

Además, para verificar la codificación de la página web, intente buscar la codificación detectada. Según el navegador, puede estar en el menú "Ver" o en el "menú de herramientas -> codificación" en Chrome. –

+0

Estoy abriendo el archivo en el bloc de notas. Cuando copio y pegué la palabra en el bloc de notas, los caracteres aparecen correctamente, pero cuando ejecuto el programa aparece lo divertido. – wynnch

Respuesta

19

Configure su Eclipse > Preferences > General > Workspace > Text file encoding en UTF-8.

+0

Guau, no puedo creer que la respuesta fuera así de simple. ¡¡¡MUCHAS GRACIAS!!! – wynnch

+0

¡Excelente! Si surge la necesidad, también puede establecer una codificación diferente para cada proyecto en 'Proyecto> Propiedades> Recurso'. – trashgod

3

El contenido está de hecho en UTF-8 y parece estar bien si se imprime en la consola. Lo que puede estar causando el problema es la descodificación y codificación de la cadena que es innecesaria. En lugar de un OutputStreamWriter intente utilizar un java.io.PrintWriter. Tiene los métodos println que imprimen la cadena con el separador de línea del sistema al final. Se vería algo así como:

printStream.println(list.get(i)); 

Además, al abrir el archivo para verlo, intente utilizar un navegador. Te permiten elegir la codificación después de abrirla para que puedas probar varias codificaciones rápidamente y ver qué se está usando realmente.

1

El Bloc de notas no es particularmente un editor rico en características. Intentará adivinar la codificación del documento, a veces con unexpected results. Los documentos de "texto sin formato" no contienen ningún metadato sobre su codificación, lo que les da ciertas limitaciones. Las aplicaciones de Windows (incluido el Bloc de notas) a menudo se basan en byte-order-mark (U + FEFF o "\uFEFF" en cadenas de Java) para determinar si la codificación es un formato Unicode. Eso podría ayudar a Notepad; va a ser inútil para su problema de página web.

La especificación HTML 4 define how output encoding should be set. Debe configurar el encabezado HTTP Content-Type además de especificar la metacodificación.

No mencionas lo que estás usando en tu aplicación web. Un servlet debe establecer el tipo de contenido setContentType("text/html; charset=UTF-8"); un JSP debería usar la directiva de página para hacer lo mismo. Otras tecnologías de visualización proporcionarán mecanismos similares.


byte[] utf8Bytes = list.get(i).getBytes("UTF-8"); 
out.write(new String(utf8Bytes, "UTF-8")); 

Este código realiza algunas operaciones inútiles; transcodifica datos de caracteres de UTF-16 a UTF-8, luego regresa de UTF-8 a UTF-16, luego escribe datos en un Writer (que transcodificará el UTF-16 a UTF-8 nuevamente). Este código es equivalente:

String str = list.get(i); 
out.write(str); 

Utilice un PrintWriter para conseguir el apoyo de nueva línea.


Puede leer más acerca de la codificación de caracteres en Java here, here y here.

Cuestiones relacionadas