Ho riformulato un po' le tue domande, per ragioni che dovrebbero risultare evidenti leggendole in sequenza.
1. È possibile configurare il filesystem Linux utilizzando la codifica a caratteri fissi per memorizzare i nomi dei file indipendentemente dall'ambiente LANG/LC_ALL?
No, questo non è possibile:come dici nella tua domanda, un nome file UNIX è solo una sequenza di byte; il kernel non sa nulla della codifica, che è interamente un concetto di spazio utente (cioè a livello di applicazione).
In altre parole, il kernel non sa nulla di LANG
/LC_*
, quindi non può essere tradotto.
2. È possibile consentire a nomi di file diversi di fare riferimento allo stesso file?
Puoi avere più voci di directory che fanno riferimento allo stesso file; puoi farlo tramite hard link o link simbolici.
Tieni presente, tuttavia, che i nomi di file che non sono validi nella codifica corrente (ad esempio, la tua stringa di caratteri GBK quando lavori in una locale UTF-8) verranno visualizzati male, se non del tutto.
3. È possibile applicare una patch al kernel per tradurre la codifica dei caratteri tra il file system e l'ambiente corrente?
Non puoi applicare patch al kernel per fare questo (vedi 1.), ma potresti -in teoria- patchare la libreria C (per esempio, glibc) per eseguire questa traduzione, e convertire sempre i nomi dei file in UTF-8 quando chiama il kernel, e riconvertirli nell'attuale encoding quando legge un nome di file dal kernel.
Un approccio più semplice potrebbe essere quello di scrivere un filesystem overlay con FUSE, che reindirizza semplicemente qualsiasi richiesta di filesystem in un'altra posizione dopo aver convertito il nome del file in/da UTF-8. Idealmente potresti montare questo filesystem in ~/trans
, e quando viene effettuato un accesso a~/trans/a/GBK/encoded/path
quindi il filesystem FUSE accede realmente a /a/UTF-8/encoded/path
.
Tuttavia, il problema con questi approcci è:cosa fai con i file che già esistono sul tuo filesystem e non sono codificati in UTF-8? Non puoi semplicemente passarli non tradotti, perché poi non sai come convertirli; non puoi manipolarli traducendo sequenze di caratteri non valide in ?
perché ciò potrebbe creare conflitti...