Eu reformulei suas perguntas um pouco, por razões que deveriam aparecem evidentes quando você as lê em sequência.
1. É possível configurar o sistema de arquivos linux usando codificação de caracteres fixos para armazenar nomes de arquivos independentemente do ambiente LANG / LC_ALL?
Não, isso não é possível: como você mencionou na sua pergunta, um arquivo UNIX nome é apenas uma seqüência de bytes; o kernel não sabe nada sobre a codificação, que é totalmente um espaço do usuário (ou seja, no nível do aplicativo) conceito.
Em outras palavras, o kernel não sabe nada sobre LANG
/ LC_*
, então ele não pode
traduzir.
2. É possível permitir que diferentes nomes de arquivos se refiram ao mesmo arquivo?
Você pode ter várias entradas de diretório referentes ao mesmo arquivo; você pode fazer isso através de links físicos ou links simbólicos .
Saiba, entretanto, que os nomes de arquivos que não são válidos no codificação atual (por exemplo, sua cadeia de caracteres GBK quando você está trabalhando em uma localidade UTF-8) será exibido incorretamente, se houver.
3. É possível corrigir o kernel para traduzir a codificação de caracteres entre o sistema de arquivos e o ambiente atual?
Você não pode corrigir o kernel para fazer isso (veja 1.), mas você pode Teoria-patch da biblioteca C (por exemplo, glibc) para executar esta tradução, e sempre converter nomes de arquivos para UTF-8 quando ele chama o kernel, e convertê-los de volta para a codificação atual quando lê um nome de arquivo do kernel.
Uma abordagem mais simples poderia ser escrever um sistema de arquivos de sobreposição com FUSE ,
que apenas redireciona qualquer solicitação do sistema de arquivos para outro local após
convertendo o nome do arquivo para / de UTF-8. Idealmente, você poderia montar este
sistema de arquivos em ~/trans
, e quando um acesso é feito para
~/trans/a/GBK/encoded/path
então o sistema de arquivos FUSE realmente acessa
%código%.
No entanto, o problema com essas abordagens é: o que você faz com
arquivos que já existem no seu sistema de arquivos e não são codificados em UTF-8?
Você não pode simplesmente passar-lhes não traduzido, porque então você não
saber convertê-los; você não pode mangle-los, traduzindo
seqüências de caracteres inválidos para /a/UTF-8/encoded/path
porque isso poderia criar
conflitos ...