Esta es mi primera publicación en el desbordamiento de la pila. He estado haciendo Java desde 1998, así que no soy principiante. Recientemente me encontré con un problema de codificación de caracteres de archivo que no recuerdo haber enfrentado alguna vez. Es bastante común tener en cuenta la codificación de caracteres de los archivos de texto y el código de escritura que maneja la codificación correctamente cuando se ejecuta en diferentes plataformas. Pero el problema que encontré fue causado por compilación en una plataforma diferente de la plataforma de ejecución. Eso fue completamente inesperado, porque en mi experiencia cuando javac crea un archivo de clase, los parámetros importantes son los parámetros java source y target, y la versión del JDK que hace la compilación. En mi caso, las clases compiladas con JDK 1.6.0_22 en Mac OS X se comportaron de manera diferente a las compiladas con 1.6.0_23-b05 en Linux, cuando se ejecutaron en Mac OS X. La fuente y el destino especificados fueron 1.4.Problema de codificación del archivo de la plataforma del compilador de Java
Una cadena codificada como ISO-8859_1 en la memoria se escribió en el disco utilizando un método PrintStream println. Según la plataforma en la que se haya COMPILADO el código de Java, la cadena se escribió de forma diferente. Esto condujo a un error. La solución para el error fue especificar la codificación del archivo explícitamente al escribir y leer el archivo.
Lo que me sorprendió fue que el comportamiento difería dependiendo de dónde se compilaron las clases, no de en qué plataforma se ejecutó la clase. Estoy bastante familiarizado con el comportamiento del código de Java de manera diferente cuando se ejecuta en diferentes plataformas. Pero da un poco de miedo cuando el mismo código, compilado en diferentes plataformas, se ejecuta de manera diferente en la misma plataforma.
¿Alguien ha encontrado este problema específico? Parece ser un mal presagio para cualquier código Java que lee y escribe cadenas para archivar sin especificar explícitamente la codificación de caracteres. ¿Y con qué frecuencia se hace eso?
Gracias,
Richard Brewster http://rabbitsoftware.com
fue el archivo problemático codificado como utf-8? ¿Había caracteres problemáticos en la fuente, o los caracteres solo eran inválidos ** después de ** la compilación solo en esa máquina en particular? –
¿Se compiló esto en clases utilizando final estático (compilar final estático "hornea" las cadenas en la clase)? o cuando dice escrito en el disco, ¿está serializando datos? ¿serializar una instancia de clase? Método de serialización que se compila con la codificación predeterminada (es decir, plataforma de compilación)? –
@Steve B .: De hecho, todos los literales de cadena y otras cadenas constantes en tiempo de compilación son "cocidas" en la clase, no solo las estáticas finales. –