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

45

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 preciso fazer antes de passá-lo para uma API de E / S de arquivo no Linux?

Martin
fonte
As respostas abaixo dizem que o sistema operacional e o sistema de arquivos não se importam com codificações. Alguns sistemas de arquivos, como o HFS +, se importam bastante. HFS +, acredito, requer UTF-8, que converte internamente em um dialeto restrito de UTF-16. O NTFS também tem um problema semelhante, mas não tenho certeza dos detalhes.
Zmccord
O HFS + também exige que os nomes sejam decompostos, o que não é bom com a tendência do linux de usar pré-compostos. web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

Respostas:

49

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, o Glib (usado pelos aplicativos Gtk +) pressupõe que todos os nomes de arquivos sejam codificados em UTF-8, independentemente do local 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 todos os nomes de arquivos 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 "seqüê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 códigos de idioma diferentes, simplesmente configurando diferentes variáveis ​​de ambiente.)

efémero
fonte
1
"Sequência de bytes delimitada por '/' terminada em NUL" "Mas sem uma codificação, como você sabe qual byte representa '/'?
Jack
1
@ Jack Sempre, '\x2F'independentemente da aparência /. Notavelmente diferente no SJIS.
ephemient
1
Ah ok. Você consideraria atualizar a resposta com essas informações? Talvez seja apenas porque eu trabalhei recentemente em uma biblioteca de conversão de charset, mas a frase "sequência de bytes delimitada '' / '" não faz sentido para mim.
Jack
Então, como ver bytes de nome de arquivo na sessão SSH no HEX?
Dims
11

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á.

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.

Bert Huijben
fonte
Ok, então eu provavelmente deveria verificar qual localidade o usuário está usando no momento e convertê-la para novos arquivos para que ele veja o nome do arquivo corretamente no Nautilus etc. Como posso saber qual é o conjunto de nomes de arquivos atual para o usuário atual?
martin
1
@ Martin Não é mesmo assim tão simples ... Diferentes processos podem usar codificações diferentes, dependendo de variáveis env e a língua foi escrito em.
Básico
5

Depende de como você monta o sistema de arquivos, basta dar uma olhada nas opções de montagem para diferentes sistemas de arquivos man mount. Por exemplo iso9660, vfate fattem iocharsete utf8opções.

Adam Byrtek
fonte
Portanto, se eu o montar usando utf8, também devo passar utf8 para o syscall open ()?
martin
Também encontrei isso ( library.gnome.org/devel/glib/unstable/… ) que parece indicar que a codificação charset de nomes de arquivos depende de qual localidade está definida?
martin