Codificación de nombres de archivos en Java

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

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(); } } } 

Ejecutarlo 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.

Establecer las propiedades file.encoding y sun.jnu.encoding en UTF-8 proporciona las cadenas correctas en el terminal, pero el archivo creado sigue siendo umlaute – ???

Ejecutando 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 muestra que el problema no es un problema del sistema de archivos, sino uno de la máquina virtual.

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

Si está utilizando Eclipse, puede ir a Ventana-> Preferencias-> General-> Área de trabajo y seleccionar la opción “Codificación de archivo de texto” que desee en el menú desplegable. Al cambiar el mío, pude recrear tu problema (y también volver a la corrección).

Si no lo está, puede agregar una variable de entorno a las ventanas (Propiedades del sistema-> Variables de entorno y en las variables del sistema que desea seleccionar Nueva …) El nombre debe ser (sin comillas) JAVA_TOOL_OPTIONS y el valor debe establecerse en -Dfile.encoding=UTF8 (o cualquier encoding que haga que la suya funcione).

Encontré la respuesta a través de esta publicación, por cierto: ¿ Establecer la encoding de caracteres Java predeterminada?

Soluciones linux

– (Permanente) Utilizando env | grep LANG env | grep LANG en el terminal le dará una o dos respuestas con respecto a qué encoding de Linux está actualmente configurada. Luego, puede configurar LANG en UTF8 (el suyo podría configurarse en ASCII) en el archivo / etc / sysconfig i18n (lo probé en 2.6.40 fedora). Básicamente, 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 encoding que desee usando java -Dfile.encoding = **** FilenameEncoding Aquí está el resultado de las dos formas:

 [youssef@JoeLaptop 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 [youssef@JoeLaptop 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í hay algunas referencias para las cosas de linux http://www.cyberciti.biz/faq/set-environment-variable-linux/

y aquí hay uno sobre el archivo -Difile.encoding ¿ Establecer la encoding de caracteres Java predeterminada?

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

  • Codificación de origen a UTF8 (project.build.sourceEncoding a UTF-8 en propiedades de Maven)
  • Argumentos del progtwig: -Dfile.encoding = utf8 y -Dsun.jnu.encoding = utf8
  • Usando java.nio.file.Path en lugar de java.io.File

Su problema es que javac está esperando una encoding diferente para su .java .java de la que lo ha guardado. ¿No te advirtió javac cuando comstackste?

Tal vez lo haya guardado con la encoding ISO-8859-1 o windows-1252 , y javac está esperando UTF-8 .

Proporcione la encoding correcta a javac con el indicador de -encoding -o equivalente para su herramienta de comstackción.