Foros del Web » Programación para mayores de 30 ;) » Java »

Codificación en lectura y escritura de ficheros

Estas en el tema de Codificación en lectura y escritura de ficheros en el foro de Java en Foros del Web. Hola. Llevo un tiempo dando vueltas al tema y me estoy volviendo loco. Comento el problema a ver si alguien tiene idea de que es ...
  #1 (permalink)  
Antiguo 09/12/2012, 04:17
 
Fecha de Ingreso: junio-2004
Mensajes: 57
Antigüedad: 20 años, 5 meses
Puntos: 0
Codificación en lectura y escritura de ficheros

Hola.

Llevo un tiempo dando vueltas al tema y me estoy volviendo loco.
Comento el problema a ver si alguien tiene idea de que es lo que está fallando.

Bien, en el trabajo me han encomendado que introduzca unas traducciones a través de PoEdit para incorporarlas a una página web. Estas traducciones me las proporcionan en un archivo excel. A partir de aquí empieza mi pequeña odisea con las codificaciones de caracteres.
Para no liarme mucho diré que tras varias pruebas y correcciónes conseguí obtener tanto en el fichero origen (messages.txt) como en el destino messages.po las cadenas legibles en UTF-8.

Ahora bien, la estructura del archivo messages.txt es la siguiente (por ejemplo en Ucraniano):
Terms of use;Умови користування
Privacy;Приватності
Site map;Мапа сайту
.
.
.
.

Entonces para no copiar esta estructura a mano, he creado una aplicación sencilla en java, la cual va leyendo cadenas del .po y si la encuentra en el txt, le coloca la traducción correcta.

El proceso funciona correctamente pero el problema es que falla en algún carácter pasando a mostrar un código irreconocible, es algo como "xD1?". Es decir, tras el proceso de traducción en el archivo .po me quedan algunas cadenas como pongo a continuación
Умови кори"xD1?"тування

La idea que tengo en la cabeza es que puede ser algo de Java a la hora de interpretar la linea leida o algo así, sino no entiendo que se entiendan todos los caracteres excepto unos pocos en el archivo .po.
Eso es todo, espero que alguien tenga idea de que es lo que puede estar pasando porque estoy saturado con esto de las codificaciones y me da la impresion de estar horas con el tema y no avanzar.

Gracias de antemano

Un saludo
  #2 (permalink)  
Antiguo 09/12/2012, 05:33
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Codificación en lectura y escritura de ficheros

Hola:

El tema es complejo porque hay muchos sitios que puede fallar, desde cómo lee java los bytes que hay en el fichero para interpretarlos como letras hasta el posible editor que estés usando para ver el resultado.

No sé cómo lees el fichero en java (readLine() o similar), pero por defecto un FileReader presupone que el fichero está en la coficación por defecto del sistema operativo, por lo que si no es UTF-8, puedes tener problemas. Prueba a crear un InputStreamReader con el constructor que permite esepecificar el juego de caracteres (CharSet).

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 10/12/2012, 04:44
 
Fecha de Ingreso: junio-2004
Mensajes: 57
Antigüedad: 20 años, 5 meses
Puntos: 0
Respuesta: Codificación en lectura y escritura de ficheros

Hola Chuidiang.

He probado a realizar el cambio que me sugeriste ya que efectivamente, antes la lectura del archivo la realizaba con FileReader.

He realizado el cambio, y ahora la lectura se realiza con InputStreamReader especificandole la codificación del archivo, pero sigue sin funcionar.
He probado únicamente a leer el fichero y mostrar lo que está leyendo con el siguiente codigo:

Código:
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("messages.po"), "utf-8"));

String line;
while ((line = in.readLine())!=null) {
     System.out.println(line);
}

El fichero origen contiene las siguientes cadenas:
#: common/new.php:6
msgid "BOTTOM_COLUMN"
msgstr "Скільки коштує Airpersons?"

#: common/new.php:7
msgid "BOTTOM_COLUMN_NEW"
msgstr "Інструменти"


Y el resultado obtenido por consola durante la lectura es el siguiente:
#: common/new.php:6
msgid "BOTTOM_COLUMN"
msgstr "??????? ?????? ?"

#: common/new.php:7
msgid "BOTTOM_COLUMN_NEW"
msgstr "???????????


Efectivamente... no lee correctamente. He comprobado que la codificación del fichero origen sea utf-8, incluso he creado un nuevo fichero asignándole yo la codificación a utf-8 y posteriormente le he introducido los textos en cirilico, pero no ha habido manera.

Alguna idea de por donde tirar?, sería de agradecer.

Un saludo
  #4 (permalink)  
Antiguo 10/12/2012, 06:24
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Codificación en lectura y escritura de ficheros

Si estás en windows la consola está en encoding CP1252, por lo que no te va a mostrar correctamente esos caracteres ya que no existen.

Si quieres comprobar si los lee correctamente escríbelos a un archivo indicando que el encoding es UTF-8, y después lo abres con un editor que admita ese formato.

Si haces debug también puedes ver el contenido de las cadenas una vez leídas para comprobar que java las recupera correctamente.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 10/12/2012, 06:47
 
Fecha de Ingreso: junio-2004
Mensajes: 57
Antigüedad: 20 años, 5 meses
Puntos: 0
Respuesta: Codificación en lectura y escritura de ficheros

Problema solucionado.

Trabajo en windows con eclipse, he cambiado la configuración de eclipse.ini (añadiendo -Dfile.encoding=utf8) y también en las preferencias de eclipse (Default enconding = UTF-8)

Tras realizar esos pasos realizé de nuevo la lectura y los datos mostrados por consola eran los correctos.

Muy agradecido a los dos de verdad. Este tema me tenía comida la moral completamente.

Un saludo.

Etiquetas: escritura, ficheros, lectura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:40.