2012-04-11 22 views
6

Estoy ejecutando una pequeña aplicación Java en una plataforma Linux incorporada. Después de reemplazar Java VM JamVM con OpenJDK, los nombres de archivo con caracteres especiales no se almacenan correctamente. Los caracteres especiales como diéresis se reemplazan por signos de interrogación.Codificación de nombres de archivos en Java

Aquí está mi código de prueba:

import java.io.File; 
import java.io.IOException; 

public class FilenameEncoding 
{ 

     public static void main (String[] args) { 
       String name = "umlaute-äöü"; 
       System.out.println("\nname = " + name); 
       System.out.print("name in Bytes: "); 
       for (byte b : name.getBytes()) { 
         System.out.print(Integer.toHexString(b & 255) + " "); 
       } 
       System.out.println(); 

       try { 
         File f = new File(name); 
         f.createNewFile(); 
       } catch (IOException e) { 
         e.printStackTrace(); 
       } 
     } 

} 

Correr da el siguiente resultado:

name = umlaute-??? 
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 

y archivo llamado Umlaute - ??? es creado.

Al establecer las propiedades file.encoding y sun.jnu.encoding en UTF-8 se obtienen las cadenas correctas en el terminal, pero el archivo creado sigue siendo umlaute - ???

Ejecución de la máquina virtual con strace, puedo ver la llamada al sistema

open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4 

Esto demuestra, que el problema no es un problema del sistema de archivos, pero una de las VM.

¿Cómo se puede establecer la codificación del nombre del archivo?

+0

por favor, vaya a través del enlace que explica establecer la codificación .. http://stackoverflow.com/questio ns/361975/setting-the-default-java-character-encoding – Phani

+0

Establecer file.encoding no ayuda. Solo afecta el contenido del archivo, pero no el nombre del archivo. –

+0

Esto podría ayudarlo un poco ... http://stackoverflow.com/questions/1184176/how-can-i-safely-encode-a-string-in-java-to-use-as-a-filename – Phani

Respuesta

3

Si está utilizando Eclipse, puede ir a Ventana-> Preferencias-> General-> Espacio de trabajo y seleccionar la opción "Codificación de archivos de texto" que desea desde el menú desplegable. Cambiando el mío, pude recrear tu problema (y también volver a la solución).

Si no lo está, puede agregar una variable de entorno a Windows (Propiedades del sistema-> Variables de entorno y en Variables del sistema desea seleccionar Nuevo ...) El nombre debe ser (sin comillas) JAVA_TOOL_OPTIONS y el valor . se debe establecer en -Dfile.encoding=UTF8 (o lo que sea la codificación se consigue la tuya para trabajar

he encontrado la respuesta a través de este mensaje, por cierto: Setting the default Java character encoding?

Linux Solutions

- (Permanente) El uso de env | grep LANG en el terminal le dará una o dos respuestas sobre la codificación con la que Linux está configurado actualmente. Luego puede establecer LANG en UTF8 (el suyo puede estar configurado en ASCII) en el archivo/etc/sysconfig i18n (lo probé en 2.6.40 fedora). Bascialmente, cambié de UTF8 (donde tenía caracteres impares) a ASCII (donde tenía signos de interrogación) y viceversa.

- (al ejecutar la JVM, pero es posible que no solucione el problema) Puede iniciar la JVM con la codificación que desee utilizando java -Dfile.encoding = **** FilenameEncoding Aquí está el resultado de las dos formas:

[[email protected] bin]$ java -Dfile.encoding=UTF8 FilenameEncoding 

name = umlaute-הצ� 
name in Bytes: 75 6d 6c 61 75 74 65 2d d7 94 d7 a6 ef bf bd 
UTF-8 
UTF8 

[[email protected] bin]$ java FilenameEncoding 

name = umlaute-??????? 
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 3f 3f 3f 3f 
US-ASCII 
ASCII 

aquí es algunas referencias para las cosas Linux http://www.cyberciti.biz/faq/set-environment-variable-linux/

y aquí está uno sobre el -Dfile.encoding Setting the default Java character encoding?

+0

Comprobé la codificación del nombre del archivo en el compilado .class-File. Ahí está correcto. El mismo archivo .class funciona en el escritorio Linux, pero no en el integrado. –

+0

¿Puedes dar más información sobre el Linux que estás utilizando? La idea es la misma, solo tiene que adaptarla al programa/sistema operativo que inicia la JVM. –

+0

Es un kernel 2.6.30 que se ejecuta en un procesador ARM v5 (Atmel AT91SAM9G20). Un hecho interesante es que JamVM podría manejar dichos nombres de archivos, pero OpenJDK no puede. ¿De qué características de SO depende OpenJDK? –

0

Su problema es que javac espera una codificación diferente para su archivo .java que la que ha guardado. ¿No te advirtió javac cuando compiló?

Quizás lo haya guardado con la codificación ISO-8859-1 o windows-1252, y javac está esperando UTF-8.

Proporcione la codificación correcta a javac con la bandera -encoding, o el equivalente para su herramienta de compilación.

0

Sé que es una vieja pregunta pero tuve el mismo problema. Todas las soluciones mencionadas no funcionó para mí, pero los siguientes resolvió que:

  • Fuente codificación UTF8 (project.build.sourceEncoding a UTF8 en propiedades de Maven)
  • argumentos del programa: -dfile .encoding = UTF-8 y UTF-8 -Dsun.jnu.encoding =
  • Usando java.nio.file.Path en lugar de java.io.File
Cuestiones relacionadas