Trochu jsem přeformuloval vaše otázky z důvodů, které by měly být zřejmé, když je budete číst v pořadí.
1. Je možné nakonfigurovat linuxový souborový systém pomocí pevného kódování znaků pro ukládání názvů souborů bez ohledu na prostředí LANG/LC_ALL?
Ne, to není možné:jak uvádíte ve své otázce, název souboru UNIX je pouze posloupnost bajtů; jádro neví nic o kódování, které je výhradně konceptem uživatelského prostoru (tj. na úrovni aplikace).
Jinými slovy, jádro neví nic o LANG
/LC_*
, takže jej nelze přeložit.
2. Je možné nechat různé názvy souborů odkazovat na stejný soubor?
Můžete mít více záznamů v adresáři odkazujících na stejný soubor; můžete to udělat pomocí pevných odkazů nebo symbolických odkazů.
Uvědomte si však, že názvy souborů, které nejsou platné v aktuálním kódování (např. váš znakový řetězec GBK, když pracujete v národním prostředí UTF-8), se zobrazí špatně, pokud vůbec.
3. Je možné opravit jádro tak, aby překládalo kódování znaků mezi souborovým systémem a aktuálním prostředím?
Nemůžete opravit jádro Chcete-li to provést (viz 1.), ale můžete - teoreticky - opravit knihovnu C (např. glibc), aby provedla tento překlad, a vždy převést názvy souborů na UTF-8, když volá jádro, a převést je zpět na aktuální kódování, když čte název souboru z jádra.
Jednodušším přístupem by mohlo být napsat překryvný souborový systém pomocí FUSE, který pouze přesměruje jakýkoli požadavek souborového systému na jiné místo po převodu názvu souboru do/z UTF-8. V ideálním případě byste mohli připojit tento souborový systém v ~/trans
a když je proveden přístup k~/trans/a/GBK/encoded/path
pak souborový systém FUSE skutečně přistupuje k/a/UTF-8/encoded/path
.
Problém s těmito přístupy je však:co uděláte se soubory, které již existují ve vašem souborovém systému a nejsou kódovány UTF-8? Nemůžete je jednoduše předat nepřeložené, protože pak nevíte, jak je převést; nemůžete je porušit překladem neplatných sekvencí znaků do ?
protože by to mohlo způsobit konflikty...