Quale codifica charset viene utilizzata per nomi di file e percorsi su Linux?


45

Dipende dal file system che utilizzo? Ad esempio ext2 / ext3 / ext4 ma anche cosa succede quando inserisco uno di quei CD-ROM "joliet" con ISO 9660? Ho sentito che POSIX contiene una specie di specifica per la codifica del set di caratteri dei nomi dei file?

In sostanza, ciò che mi chiedo è se ho ottenuto un nome file codificato UTF-8, quale elaborazione / copertura devo fare prima di passarlo a un file I / O API in Linux?


Le risposte di seguito affermano che il sistema operativo e il filesystem non si preoccupano delle codifiche. Alcuni filesystem, come HFS +, sono molto importanti. HFS +, credo, richiede UTF-8, che converte internamente in un dialetto limitato di UTF-16. Anche NTFS ha un problema simile, ma non sono chiaro sui dettagli.
zmccord,

HFS + richiede anche che i nomi vengano decomposti, il che non gioca bene con la tendenza di Linux a usare precomposti. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Risposte:


49

Come notato da altri, non c'è davvero una risposta a questa: nomi di file e percorsi non hanno una codifica; il sistema operativo si occupa solo della sequenza di byte. Le singole applicazioni possono scegliere di interpretarle come codificate in qualche modo, ma questo varia.

In particolare, Glib (utilizzato dalle app Gtk +) presuppone che tutti i nomi dei file siano codificati UTF-8, indipendentemente dalle impostazioni locali dell'utente . Questo può essere sostituito con le variabili di ambiente G_FILENAME_ENCODING e G_BROKEN_FILENAMES .

D'altra parte, per impostazione predefinita Qt presume che tutti i nomi dei file siano codificati nelle impostazioni internazionali dell'utente corrente . Una singola applicazione può scegliere di ignorare questo presupposto, sebbene io non ne sappia nulla e non esiste alcun interruttore di override esterno.

Le moderne distribuzioni Linux sono configurate in modo tale che tutti gli utenti utilizzino le versioni locali UTF-8 e che i percorsi su supporti di filesystem stranieri vengano tradotti in UTF-8, quindi questa differenza di strategia generalmente non ha alcun effetto. Tuttavia, se vuoi davvero essere al sicuro, non puoi assumere alcuna struttura sui nomi dei file oltre "sequenza NUL-terminata, '/' - delimitata da byte".

(Nota anche: le impostazioni internazionali possono variare in base al processo. Due processi diversi eseguiti dallo stesso utente possono trovarsi in diverse località semplicemente impostando variabili di ambiente diverse.)


1
"Sequenza delimitata da NUL, '/' - delimitata da byte" Ma senza una codifica, come fai a sapere quale byte rappresenta '/'?
Jack

1
@Jack Sempre '\x2F'indipendentemente da come appare /. In particolare diverso in SJIS.
effimero

1
Ah ok. Considereresti di aggiornare la risposta con quelle informazioni? Forse è solo perché di recente ho lavorato su una libreria di conversione di set di caratteri, ma la frase "'/' - sequenza delimitata di byte" non ha senso per me.
Jack,

Quindi, come vedere i byte del nome file nella sessione SSH in HEX?
Dims

11

Al livello unix / posix di linux non importa quale codifica usi. Memorizza la sequenza di byte della codifica corrente così com'è.

Penso che quelle opzioni di mount siano lì per aiutarti a convertire filesystem specifici che definiscono un set di caratteri nel tuo set di sistemi. (CDROM, NTFS e le varianti FAT usano alcune varianti unicode).

Vorrei che unix definisse una codifica globale di sistema, ma in realtà è un'impostazione per utente. Quindi, se definisci una codifica diversa rispetto al tuo collega, i nomi dei file verranno visualizzati in modo diverso.


Ok, quindi dovrei probabilmente controllare quale locale sta attualmente utilizzando l'utente e convertirlo in quello per i nuovi file in modo che possa vedere correttamente il nome del file in Nautilus ecc. Come posso sapere qual è il set di caratteri corrente per l'utente corrente?
martin,

1
@martin Non è nemmeno così semplice ... Processi diversi possono usare codifiche diverse, a seconda delle variabili env e della lingua in cui è stato scritto.
Basic

5

Dipende da come monti il ​​file system, dai un'occhiata alle opzioni di mount per diversi file system man mount. Per esempio iso9660, vfate fathanno iocharsete utf8opzioni.


Quindi, se lo monto usando utf8, dovrei anche passare utf8 a open () syscall?
martin,

Ho anche trovato questo ( library.gnome.org/devel/glib/unstable/… ) che sembra indicare che la codifica del set di caratteri dei nomi dei file dipende dalle impostazioni locali?
martin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.