Nomes de arquivos UTF 8?

15

Em sistemas operacionais baseados em Unix, os nomes de arquivos utf6 são permitidos? Nesse caso, preciso fazer algo especial para gravar o arquivo no disco.

Deixe-me explicar o que espero fazer. Estou escrevendo um aplicativo que irá transferir um arquivo via ftp para um sistema remoto, mas o nome do arquivo é definido dinamicamente como através de algum conjunto de metadados que potencialmente podem estar no utf8. Gostaria de saber se há algo que eu preciso fazer para gravar o arquivo em disco no unix / linux.

Além disso, como acompanhamento, alguém sabe o que aconteceria se eu fizesse o upload de um nome de arquivo utf 8 para um sistema não compatível com utf8?

Mark D
fonte

Respostas:

20

No Unix / Linux, um nome de arquivo é uma sequência de todos os bytes, exceto uma barra ou um NUL. Uma barra separa os componentes do caminho e um NUL termina um nome de caminho.

Portanto, você pode usar a codificação que desejar para os nomes de arquivos. Alguns aplicativos podem ter problemas com algumas codificações, se forem ingênuos sobre quais caracteres podem estar nos nomes de arquivos - por exemplo, scripts shell mal escritos geralmente não tratam nomes de arquivos com espaços.

Os ambientes modernos Unix / Linux lidam com nomes de arquivos codificados em UTF-8 muito bem.

camh
fonte
12

Internamente, a maioria dos sistemas de arquivos armazena bytes: o driver do sistema de arquivos não se importa com o significado dos bytes. O driver genérico do sistema de arquivos no Linux e na maioria dos outros unices modernos permite que qualquer byte que não seja /e o byte nulo apareça em um nome de arquivo.

Existem sistemas de arquivos que podem ter restrições de codificação - geralmente sistemas de arquivos não nativos, como FAT ou NTFS. Alguns sistemas de arquivos de rede como o Samba podem converter entre a codificação do servidor e a codificação do cliente; você precisará garantir que as configurações do servidor e do cliente sejam coerentes.

Convencionalmente, na maioria dos sistemas, os bytes que compõem um nome de arquivo são interpretados como UTF-8. Se você executar um aplicativo que interprete os nomes dos arquivos como caracteres, por exemplo, um aplicativo que transmita os nomes por FTP, pode ser necessário configurá-lo para informar que os nomes dos arquivos estão codificados em UTF-8. Definir o ambiente LC_CTYPEpara um código de idioma UTF-8, como en_US.UTF-8faz o truque para muitos aplicativos de linha de comando.

Se você armazena arquivos em um sistema que não suporta UTF-8, isso não importa. Os bytes permanecerão os mesmos. Você não poderá exibir os caracteres que compõem os nomes dos arquivos, mas se você copiar os arquivos para um sistema que suporte UTF-8, esses mesmos bytes ainda serão exibidos como caracteres UTF-8.

Se você estiver escrevendo seu próprio aplicativo, usar UTF-8 internamente e, sempre que possível, para armazenamento e transmissão é uma boa idéia.

Gilles 'SO- parar de ser mau'
fonte