2010-04-29 18 views
9

no puedo leer y escribir caracteres extendidos (Francés caracteres acentuados, por ejemplo) a un archivo de texto usando los métodos InputStreamReader estándar que se muestran en los ejemplos de la API de Android. Cuando leí de arriba usando el archivo:¿Cómo leer y escribir UTF-8 en un disco en Android?

InputStreamReader tmp = new InputStreamReader(in); 
BufferedReader reader = new BufferedReader(tmp); 
String str; 
while ((str = reader.readLine()) != null) { 
... 

la lectura cadena se trunca en los caracteres extendidos en lugar de en la línea de fin de. La segunda mitad de la cadena viene en la siguiente línea. Asumo que necesito conservar mis datos como UTF-8 pero no puedo encontrar ningún ejemplo de eso, y soy nuevo en Java.

Puede alguien me proporcione un ejemplo o un enlace a la documentación pertinente?

+0

Esto es realmente una pregunta general de Java. – itsadok

+0

¿Es general Java? Si utiliza openFileOutput escribir en el área de datos privada en Android, no hay ningún constructor con una opción de juego de caracteres: http://developer.android.com/reference/android/content/Context.html#openFileOutput%28java.lang.String ,% 20int% 29 –

Respuesta

26

muy simple y directo. :)

String filePath = "/sdcard/utf8_file.txt"; 
String UTF8 = "utf8"; 
int BUFFER_SIZE = 8192; 

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), UTF8),BUFFER_SIZE); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath), UTF8),BUFFER_SIZE); 
+0

Gracias. ¿Eso funciona al guardar en el área de datos privados también? –

+0

Claro. Nada específico de Android aquí arriba 'openFileOutput (..)'. – yanchenko

+0

Me refiero al uso de openFileOutput? –

9

Al crear una instancia del InputStreamReader, utilice el constructor que toma un conjunto de caracteres.

InputStreamReader tmp = new InputStreamReader(in, "UTF-8"); 

Y hacer una cosa similar con OutputStreamWriter

me gusta tener un

public static final Charset UTF8 = Charset.forName("UTF-8"); 

de alguna clase de utilidad en mi código, por lo que puedo llamar (ver más en el Doc)

InputStreamReader tmp = new InputStreamReader(in, MyUtils.UTF8); 

y no tiene que manipular UnsupportedEncodingException cada solo tiempo

1

esto sólo debería funcionar en Android, aunque sin especificar explícitamente UTF-8, ya que el conjunto de caracteres por defecto es UTF-8. si se puede reproducir este problema, por favor, levanten un error con un caso de prueba reproducible aquí:

http://code.google.com/p/android/issues/entry

+0

Definitivamente tuve que cambiar a UTF-8 para arreglar el error. Tuve un resultado positivo con mis usuarios que previamente descubrieron que los "caracteres extendidos", como French E circumflex, hacían que el archivo no se volviera a leer correctamente. Conseguí que un usuario me enviara su archivo y cuando lo leí en el depurador vi que los caracteres extendidos se trataban como un final de línea. Todavía tengo los archivos originales.Cuando vuelva a casa, ejecutaré un proyecto de prueba y los usaré para demostrar. Ver mi primera pregunta para el código: http://stackoverflow.com/questions/2700983/problem-saving-file-on-motorola-droid-android-2-1 –

0

si se enfrentan a cualquier tipo de problema de tratar de hacer esto. Tienes que Encode y Decode tus datos en Base64. Esto funcionó para mí. Puedo compartir el código si lo necesitas.

0

Comprobar la codificación de su archivo haciendo clic derecho en el Explorador de proyectos y seleccionando propiedades. Si no es la codificación correcta, tendrá que volver a ingresar sus caracteres especiales después de cambiarla, o al menos esa fue mi experiencia.

Cuestiones relacionadas