Leer / escribir archivo .txt con caracteres especiales

Abro el Bloc de notas (Windows) y escribo

Some lines with special characters Special: Žđšćč 

y vaya a Guardar como … “someFile.txt” con la encoding configurada en UTF-8 .

En Java tengo

 FileInputStream fis = new FileInputStream(new File("someFile.txt")); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader in = new BufferedReader(isr); String line; while((line = in.readLine()) != null) { printLine(line); } in.close(); 

Pero recibo signos de interrogación y caracteres “especiales” similares. ¿Por qué?

EDITAR: Tengo esta entrada (una línea en el archivo .txt)

 665,Žđšćč 

y este código

 FileInputStream fis = new FileInputStream(new File(fileName)); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader in = new BufferedReader(isr); String line; while((line = in.readLine()) != null) { Toast.makeText(mContext, line, Toast.LENGTH_LONG).show(); Pattern p = Pattern.compile(","); String[] article = p.split(line); Toast.makeText(mContext, article[0], Toast.LENGTH_LONG).show(); Toast.makeText(mContext, Integer.parseInt(article[0]), Toast.LENGTH_LONG).show(); } in.close(); 

Y la salida de Toast (para aquellos que no están familiarizados con Android, Toast es solo un método para mostrar una ventana emergente en la pantalla con texto particular) está bien. La consola muestra “caracteres extraños” (probablemente debido a la encoding en la ventana de la consola). Pero falla al analizar un número entero porque la consola dice esto ( warning: toast output is just fine ) – ¿ Problema ?

Parece que The String contiene algunos caracteres “extraños” que Toast no puede mostrar / renderizar, pero cuando bash analizarlos, se cuelga. Sugerencias?

Si pongo ANSI en NotePad funciona (análisis entero) y no hay caracteres extraños como en la imagen de arriba, pero, por supuesto, mis caracteres especiales no funcionan.

Es la consola de salida que no admite esos caracteres. Como está utilizando Eclipse, debe asegurarse de que esté configurado para usar UTF-8 para esto. Puede hacerlo desde Ventana> Preferencias> General> Espacio de trabajo> Codificación de archivo de texto> configurar como UTF-8 .

Ver también:

  • Unicode – Cómo obtener los personajes correctos?

Actualice según la pregunta actualizada y los comentarios, aparentemente el BOM UTF-8 es el culpable. El Bloc de notas de forma predeterminada agrega la BOM UTF-8 al guardar. Parece que el JRE en tu HTC no se traga eso. Es posible que desee considerar utilizar el ejemplo UnicodeReader como se describe en esta respuesta en lugar de InputStreamReader en su código. Detecta automáticamente y omite la lista de materiales.

 FileInputStream fis = new FileInputStream(new File(fileName)); UnicodeReader ur = new UnicodeReader(fis, "UTF-8"); BufferedReader in = new BufferedReader(ur); 

Sin relación con el problema real, es una buena práctica cerrar los recursos en bloque finally para asegurarse de que se cerrarán en caso de excepciones.

 BufferedReader reader = null; try { reader = new BufferedReader(new UnicodeReader(new FileInputStream(fileName), "UTF-8")); // ... } finally { if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} } 

También sin relación, sugiero poner Pattern p = Pattern.compile(","); fuera del bucle, o incluso convertirlo en una constante estática, porque es relativamente costoso comstackrlo y no es necesario hacer esto cada vez dentro de un bucle.

Su código se ve bien, pero un error muy común y fácil es confundir lo que está impreso en la pantalla con lo que está en la Cadena. Verifique con un depurador si la cadena no está bien leída.

Es posible que el Bloc de notas no sea capaz de manejar caracteres que no sean ASCII. Pruebe con otro editor de texto. Si desea atenerse a lo que está disponible en la instalación de Windows, intente con el Wordpad.

 "Not all sequences of bytes are valid UTF-8." 

Ver

http://en.wikipedia.org/wiki/UTF-8

en “Secuencias de bytes inválidas” para detalles específicos.

El Bloc de notas no guarda símbolos especiales correctamente. Tuve un problema similar y usé Notepad ++ en su lugar y seleccioné la encoding UTf-8 desde allí. Cuando hice esto, mi progtwig ya no se bloqueó al aplicar los métodos de la biblioteca String a diferencia de cuando creé el archivo de texto en el Bloc de notas.

¿Estás utilizando el personaje de la conversión como parte de la solicitud / respuesta de servlet? Si es así, request.setEncoding("UTF-8")
o
response.setCharacterEncoding("UTF-8")

debería resolver tu propósito