Quel codage de jeu de caractères est utilisé pour les noms de fichiers et les chemins sous Linux?

45

Cela dépend-il du système de fichiers que j'utilise? Par exemple, ext2 / ext3 / ext4 mais aussi que se passe-t-il lorsque j'insère l'un de ces CD-ROM "joliet" avec ISO 9660? J'ai entendu dire que POSIX contient une sorte de spécification pour l'encodage de charset des noms de fichiers?

En gros, ce que je me demande, c’est que si j’ai un fichier UTF-8 encodé, quel traitement / jaquette dois-je effectuer avant de le transmettre à une API d’E / S sur fichier sous Linux?

Martin
la source
Les réponses ci-dessous indiquent que le système d'exploitation et le système de fichiers ne se préoccupent pas des encodages. Certains systèmes de fichiers, tels que HFS +, sont très utiles. HFS +, je crois, nécessite UTF-8, qu’il convertit en interne en un dialecte restreint de UTF-16. NTFS a également un problème similaire mais je ne suis pas clair sur les détails.
Zmccord
HFS + exige également que les noms soient décomposés, ce qui ne convient pas à la tendance de Linux à utiliser les précomposés. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Réponses:

49

Comme l'ont noté d'autres personnes, il n'y a pas vraiment de réponse à cela: les noms de fichiers et les chemins d'accès n'ont pas d'encodage; le système d'exploitation ne traite que de la séquence d'octets. Certaines applications peuvent choisir de les interpréter comme codées, mais cela varie.

Glib (utilisé par Gtk + apps) suppose en particulier que tous les noms de fichiers sont codés en UTF-8, quelle que soit la langue de l'utilisateur . Cela peut être remplacé par les variables d'environnement G_FILENAME_ENCODING et G_BROKEN_FILENAMES .

Par défaut, Qt considère par défaut que tous les noms de fichiers sont codés dans les paramètres régionaux de l'utilisateur actuel . Une application individuelle peut choisir de remplacer cette hypothèse, bien que je n'en sache aucune, et qu'il n'y a pas de commutateur de dérogation externe.

Les distributions Linux modernes sont configurées de manière à ce que tous les utilisateurs utilisent les locales UTF-8 et les chemins sur les montages de systèmes de fichiers étrangers sont convertis en UTF-8; cette différence de stratégie n'a donc généralement aucun effet. Cependant, si vous voulez vraiment être sûr, vous ne pouvez pas supposer de structure de noms de fichiers au-delà de "séquence d'octets délimitée par" NUL ".

(Remarque: les paramètres régionaux peuvent varier d'un processus à l'autre. Deux processus différents exécutés par le même utilisateur peuvent se trouver dans des paramètres régionaux différents simplement en configurant différentes variables d'environnement.)

éphémère
la source
1
"NUL-terminé, '/' - séquence d'octets délimitée" Mais sans codage, comment savoir quel octet représente "/"?
Jack
1
@ Jack Toujours '\x2F'peu importe ce à quoi ça ressemble /. Notamment différent dans SJIS.
éphémère
1
Ah ok. Souhaitez-vous envisager de mettre à jour la réponse avec cette information? C’est peut-être simplement parce que j’ai récemment travaillé sur une bibliothèque de conversion de charset, mais la phrase "'/' - séquence d’octets délimitée" n’a aucun sens pour moi.
Jack le
Alors, comment voir les octets du nom de fichier dans une session SSH dans HEX?
Dims
11

La couche unix / posix de Linux ne se soucie pas de l’encodage que vous utilisez. Il stocke la séquence d'octets de votre codage actuel tel quel.

Je pense que ces options de montage sont là pour vous aider à convertir des systèmes de fichiers spécifiques qui définissent un jeu de caractères en votre jeu de caractères système. (Les variantes de CDROM, NTFS et FAT utilisent certaines variantes unicode).

Je souhaite qu'unix définisse un encodage global du système, mais il s'agit en réalité d'un paramètre par utilisateur. Donc, si vous définissez un codage différent de votre collègue, vos noms de fichiers apparaîtront différemment.

Bert Huijben
la source
Ok, alors je devrais probablement vérifier les paramètres régionaux actuellement utilisés par l'utilisateur et les convertir en nouveaux fichiers afin qu'il puisse voir le nom de fichier correctement dans Nautilus, etc. Comment savoir quel est le jeu de caractères du nom de fichier actuel pour l'utilisateur actuel?
martin
1
@martin Ce n'est même pas si simple ... Différents processus peuvent utiliser différents codages, en fonction des variables env et du langage dans lequel ils ont été écrits.
Base
5

Cela dépend de la manière dont vous montez le système de fichiers. Il suffit de jeter un coup d’œil sur les options de montage pour différents systèmes de fichiers dans man mount. Par exemple iso9660, vfatet fatavoir iocharsetet utf8options.

Adam Byrtek
la source
Donc, si je le monte en utilisant utf8, devrais-je aussi passer utf8 à l'appel système ()?
martin
J'ai aussi trouvé ceci ( library.gnome.org/devel/glib/unstable/… ) qui semble indiquer que le codage du jeu de caractères des noms de fichiers dépend de la locale définie.
martin