Que codificação de charset é usada para nomes de arquivos e caminhos no Linux?

41

Depende de qual sistema de arquivos eu uso? Por exemplo, ext2 / ext3 / ext4, mas também o que acontece quando insiro um daqueles CD-ROMs "joliet" com ISO 9660? Ouvi dizer que POSIX contém algum tipo de especificação para a codificação de charset de nomes de arquivos?

Essencialmente, o que eu imagino é se eu tenho um nome de arquivo codificado em UTF-8, que processamento / coversion eu preciso fazer antes de passá-lo para uma API de E / S de arquivos no Linux?

    
por martin 15.09.2010 / 18:47

3 respostas

46

Como observado por outros, não há realmente uma resposta para isso: nomes de arquivos e caminhos não possuem uma codificação; o sistema operacional lida apenas com a seqüência de bytes. Aplicações individuais podem optar por interpretá-las como sendo codificadas de alguma forma, mas isso varia.

Especificamente, Glib (usado pelos aplicativos Gtk +) assume que todos os nomes de arquivos são codificados em UTF-8, independentemente da localidade do usuário . Isso pode ser substituído pelas variáveis de ambiente G_FILENAME_ENCODING e G_BROKEN_FILENAMES .

Por outro lado, o Qt assume como padrão supor que todos os nomes de arquivos estão codificados na localidade do usuário atual . Um aplicativo individual pode optar por substituir essa suposição, embora eu não saiba de nenhum que faça isso e não há uma alternância de substituição externa.

As distribuições Linux modernas são configuradas de tal forma que todos os usuários estão usando locales UTF-8 e os caminhos em montagens de sistemas de arquivos estrangeiros são traduzidos para UTF-8, portanto essa diferença nas estratégias geralmente não tem efeito. No entanto, se você realmente deseja estar seguro, não pode assumir qualquer estrutura sobre nomes de arquivos além da "sequência de bytes delimitada por NUL, '/'".

(Observe também que: locale pode variar de acordo com o processo. Dois processos diferentes executados pelo mesmo usuário podem estar em locais diferentes simplesmente configurando variáveis de ambiente diferentes.)

    
por 15.09.2010 / 23:30
11

A camada unix / posix do linux não se importa com qual codificação você usa. Ele armazena a sequência de bytes da sua codificação atual como está.

Acho que essas opções de montagem estão disponíveis para ajudá-lo a converter sistemas de arquivos específicos que definem um conjunto de caracteres para o conjunto de caracteres do sistema. (CDROMs, NTFS e as variantes FAT usam algumas variantes unicode).

Desejo que o unix defina uma codificação global do sistema, mas na verdade é uma configuração por usuário. Então, se você definir uma codificação diferente do seu colega, os nomes dos seus arquivos aparecerão de maneira diferente.

    
por 15.09.2010 / 19:14
5

Depende de como você monta o sistema de arquivos, basta dar uma olhada nas opções de montagem para diferentes sistemas de arquivos em man mount . Por exemplo, iso9660 , vfat e fat têm iocharset e utf8 opções.

    
por 15.09.2010 / 19:01