problema de codificación de nombre de archivo

9

Recibo un archivo con un nombre faroese e intento guardarlo en un script PHP:

2010_08_Útflutningur.xls

En Ubuntu 10.04 LTS lo guarda como:

2010_08_�tflutningur.xls (invalid encoding)

He instalado y ejecuto utf8-migration-tool, pero sin efecto.

¿Es este un error de Ubuntu que puedo solucionar o solo tengo que renunciar y modificar el nombre en php?

¿Hay un documento que indique cuál es el juego de caracteres aceptable para un nombre de archivo en Ubuntu, o cuáles son las especificaciones de codificación?

Gracias

Elzo Valugi
fuente
¿Cómo está recibiendo y guardando el archivo a través de PHP? (¿Cómo se ve el código?)
Kees Cook
Lo estaba analizando desde un sistema de correo electrónico. El código es complejo :)
Elzo Valugi
Hay un Q&A similar con un script para reparar nombres de archivos rotos.
lumbric

Respuestas:

5

Esto parece un problema de codificación. Desafortunadamente, PHP necesita un poco de mano cuando se trata de codificaciones, porque sus cadenas son de un solo byte por defecto. Si está creando el nombre de archivo dentro de PHP, utf8_encode()debería ser útil; tenga en cuenta, sin embargo, que supone la codificación ISO-8859-1 para la entrada.

Por otro lado, si está utilizando el nombre de archivo enviado por un cliente, tal vez pueda solicitar que el cliente haga la codificación por usted. Eso se hace con el accept-charsetatributo de la <form>etiqueta, y / o configurando el juego de caracteres de la página en la que se encuentra el formulario. Ciertos clientes pueden usar uno u otro, por lo que para obtener mejores resultados, use UTF-8 para cada uno.

eswald
fuente
7

Por defecto, Ubuntu usa UTF-8 para los nombres de archivo. La mayoría de las distribuciones de Linux modernas y muchos otros sistemas operativos lo hacen (Windows / NTFS es la excepción más conocida con UTF-16).

Para arreglar archivos que tienen nombres en la codificación incorrecta como la que muestra, puede intentar usar nautilus-filename-repairer

sudo apt-get install nautilus-filename-repairer

Puede usar las iconvfunciones de PHP para convertir cadenas (nombres de archivo) de una codificación a la otra. Por supuesto, eso requiere que sepas en qué codificación están para empezar.

Para obtener nombres de archivo codificados correctamente del cliente, puede probar la técnica explicada por eswald.

JanC
fuente