2009-06-11 28 views
10

Pregunta realmente simple realmente. Necesito leer un archivo de texto Unicode en un programa Java.Lea archivos de texto unicode con java

Estoy acostumbrado al uso de texto ASCII con un combo BufferedReader FileReader que es, obviamente, no funciona :(

sé que puedo leer una cadena de la forma 'tradicional' usando un lector de tamponado y después convertirlo usando algo como:

temp = new String(temp.getBytes(), "UTF-16"); 

Pero hay una manera de envolver al lector en un 'convertidor'

EDIT:? el archivo comienza con FF FE

Respuesta

13

no te envuelva el lector, en lugar que le envuelva la corriente usando un InputStreamReader. A continuación, puede envolver que con su BufferedReader que actualmente utiliza

BufferedReader in = new BufferedReader(new InputStreamReader(stream, encoding)); 
+1

Quiero leer letras hebreas, ¿qué reemplazaría con "codificación"? – CodyBugstein

+1

para responder mi propia pregunta, es "UTF-8" – CodyBugstein

+0

'El constructor BufferedReader (InputStreamReader) no está definido'? – Squareoot

7

Algunas notas:

  • la codificación "UTF-16" puede leer cualquier codificado-endian grandes archivos poco- o marcados con una BOM; ver here para obtener una lista de codificaciones de Java 6; no se indica explícitamente qué endianidad se utilizará al escribir usando "UTF-16" - parece ser big-endian - por lo que es posible que desee utilizar "UnicodeLittle" al guardar los datos
  • tenga cuidado al usar la clase String encode métodos/decodificar, especialmente con una marcada codificación de anchura variable como UTF-16 - use them only on whole data
  • como otros han dicho, a menudo es mejor para leer datos de carácter envolviendo su InputStream con un InputStreamReader; puede concatenate your input en una sola Cadena usando un buffer StringBuilder o similar.
+0

Gracias por el enlace a los tipos de codificación. Encontré el adecuado para mí. –

-1
Scanner scan = new Scanner(new File("C:\\Users\\daniel\\Desktop\\Corpus.txt")); 
    while(scan.hasNext()){ 

    System.out.println(scan.nextLine()); 
    } 
+1

¿Es la clase del escáner específica para Unicode? Simplemente leyendo el código (y no siendo consciente de tales cosas) es difícil determinar si esto realmente responde a la pregunta. Para los problemas en los que el PO puede necesitar una comprensión conceptual y un código, es útil incluir una breve descripción del texto de * por qué * el código funciona en su respuesta. Tal descripción sería beneficiosa aquí. Además, he editado su publicación para poner el código en "Code Markup". Haga lo mismo en el futuro, ya que lo hace mucho más fácil de leer. Bienvenido a StackOverflow! – BradleyDotNET

1

recomendaría utilizar UnicodeReader del API de datos de Google, consulte this answer para una pregunta similar. Automáticamente detectará la codificación de la marca de orden de Byte (BOM).

También puede considerar BOMInputStream en Apache Commons IO que hace básicamente lo mismo pero no cubre todas las versiones alternativas de BOM.