it-swarm-pt.com

Qual codificação de charset é usada para nomes de arquivo e caminhos no Linux?

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

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

47
martin

Como observado por outros, não há realmente uma resposta para isso: nomes de arquivos e caminhos não têm uma codificação; o sistema operacional lida apenas com a sequência de bytes. Aplicativos individuais podem optar por interpretá-los como sendo codificados 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 assumindo que todos os nomes de arquivos são codificados no código do idioma do usuário atual . Um aplicativo individual pode optar por substituir essa suposição, embora eu não conheça nenhum deles, e não haja uma opção de substituição externa.

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

(Observe também: o código do idioma pode variar de acordo com o processo. Dois processos diferentes executados pelo mesmo usuário podem estar em locais diferentes, simplesmente configurando diferentes variáveis ​​de ambiente.)

50
ephemient

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

Eu acho que essas opções de montagem existem 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 variantes FAT usam algumas variantes unicode).

Eu gostaria que o unix definisse uma codificação global do sistema, mas na verdade é uma configuração por usuário. Portanto, se você definir uma codificação diferente do seu colega, seus nomes de arquivos aparecerão de maneira diferente.

11
Bert Huijben

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 possuem iocharset e utf8 opções.

5
Adam Byrtek