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


45

¿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?


Las respuestas a continuación dicen que el sistema operativo y el sistema de archivos no se preocupan por las codificaciones. Algunos sistemas de archivos, como HFS +, se preocupan mucho. HFS +, creo, requiere UTF-8, que convierte internamente en un dialecto restringido de UTF-16. NTFS también tiene un problema similar, pero no tengo claros los detalles.
zmccord

HFS + también requiere que los nombres se descompongan, lo que no juega bien con la tendencia de Linux a usar precompuesto. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Respuestas:


49

Como han señalado otros, no hay realmente una respuesta para esto: los nombres de archivo y las rutas no tienen codificación; El sistema operativo solo se ocupa de 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 asume que todos los nombres de archivos 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).


1
"Secuencia de bytes delimitada por '/' terminada en NUL" Pero sin una codificación, ¿cómo sabe qué byte representa '/'?
Jack

1
@Jack Siempre, '\x2F'independientemente de lo que parezca /. Notablemente diferente en SJIS.
Ephemient

1
Ah bien. ¿Considerarías actualizar la respuesta con esa información? Tal vez sea porque trabajé recientemente en una biblioteca de conversión de juegos de caracteres, pero la frase "'/' - secuencia de bytes delimitada" no tiene sentido para mí.
Jack

Entonces, ¿cómo ver los bytes del nombre de archivo en la sesión SSH en HEX?
Dims

11

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


De acuerdo, entonces probablemente debería verificar qué configuración regional está usando el usuario actualmente y convertirla a los archivos nuevos para que vea el nombre de archivo correctamente en Nautilus, etc. ¿Cómo puedo saber cuál es el conjunto de caracteres del nombre de archivo actual para el usuario actual?
Martin

1
@martin Ni siquiera es tan simple ... Diferentes procesos pueden usar diferentes codificaciones, dependiendo de las variables env y el idioma en el que se escribió.
Básico

5

Depende de cómo monte el sistema de archivos, solo eche un vistazo a las opciones de montaje para diferentes sistemas de archivos man mount. Por ejemplo iso9660, vfaty fattener iocharsety utf8opciones.


Entonces, si lo monte usando utf8, ¿también debería pasar utf8 al open () syscall?
Martin

También encontré esto ( library.gnome.org/devel/glib/unstable/… ) que parece indicar que la codificación de caracteres de los nombres de archivos depende de la configuración regional establecida.
Martin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.