it-swarm-es.tech

¿Qué codificación de caracteres se usa para nombres de archivos y rutas en Linux?

¿Depende de qué sistema de archivos utilizo? Por ejemplo, ext2/ext3/ext4 pero también ¿qué sucede cuando inserto uno de esos CD-ROM "joliet" con ISO 9660? ¿He oído que POSIX contiene algún tipo de especificación para la codificación de juegos de caracteres de nombres de archivo?

Esencialmente, lo que me pregunto es si obtuve un nombre de archivo codificado UTF-8, ¿qué procesamiento/cobertura necesito hacer antes de pasarlo a una API de E/S de archivo en Linux?

47
martin

Como han señalado otros, no hay realmente una respuesta a esto: los nombres de archivo y las rutas no tienen codificación; el sistema operativo solo trata con la secuencia de bytes Las aplicaciones individuales pueden elegir interpretarlas como codificadas de alguna manera, pero esto varía.

Específicamente, Glib (utilizado por las aplicaciones Gtk +) supone que todos los nombres de archivo están codificados en UTF-8, independientemente de la configuración regional del usuario . Esto puede anularse con las variables de entorno G_FILENAME_ENCODING y G_BROKEN_FILENAMES .

Por otro lado, Qt por defecto es suponiendo que todos los nombres de archivo estén codificados en la configuración regional del usuario actual . Una aplicación individual puede optar por anular esta suposición, aunque no conozco ninguna que lo haga, y no hay un interruptor de anulación externo.

Las distribuciones modernas de Linux están configuradas de tal manera que todos los usuarios están utilizando configuraciones regionales UTF-8 y las rutas en los montajes de sistemas de archivos externos se traducen a UTF-8, por lo que esta diferencia en las estrategias generalmente no tiene efecto. Sin embargo, si realmente desea estar seguro, no puede asumir ninguna estructura sobre los nombres de archivo más allá de "secuencia de bytes delimitada por '/' terminada en NUL".

(También tenga en cuenta: la configuración regional puede variar según el proceso. Dos procesos diferentes ejecutados por el mismo usuario pueden estar en diferentes configuraciones regionales simplemente teniendo diferentes variables de entorno establecidas).

50
ephemient

A la capa unix/posix de Linux no le importa qué codificación use. Almacena la secuencia de bytes de su codificación actual tal cual.

Creo que esas opciones de montaje están ahí para ayudarlo a convertir sistemas de archivos específicos que definen un conjunto de caracteres en el conjunto de caracteres de su sistema. (Las variantes CDROM, NTFS y FAT utilizan algunas variantes unicode).

Deseo que Unix defina una codificación global del sistema, pero en realidad es una configuración por usuario. Entonces, si define una codificación diferente, entonces su colega, sus nombres de archivo se mostrarán de manera diferente.

11
Bert Huijben

Depende de cómo monte el sistema de archivos, solo eche un vistazo a las opciones de montaje para diferentes sistemas de archivos en man mount. Por ejemplo iso9660, vfat y fat tienen iocharset y utf8 opciones.

5
Adam Byrtek