UTF 8 nomes de arquivos?

13

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

Deixe-me explicar o que espero fazer. Eu estou escrevendo um aplicativo que irá transferir um arquivo via ftp para um sistema remoto, mas o nome do arquivo é dinamicamente configurado para via algum conjunto de metadados que potencialmente poderia estar em utf8. Eu estou querendo saber se há algo que eu preciso fazer para gravar o arquivo no disco em unix / linux.

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

    
por Mark D 07.05.2012 / 03:48

2 respostas

18

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

Assim, você pode usar qualquer codificação desejada para nomes de arquivos. Alguns aplicativos podem ter problemas com algumas codificações se forem ingênuos sobre quais caracteres podem estar em nomes de arquivos - por exemplo, scripts de shell mal escritos geralmente não manipulam nomes de arquivos com espaços.

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

    
por 07.05.2012 / 10:21
11

Internamente, a maioria dos bytes de armazenamento de sistemas de arquivos: o driver do sistema de arquivos não se importa com o significado dos bytes. O driver do sistema de arquivos genérico no Linux e na maioria dos outros unices modernos permite que qualquer byte diferente de / e o byte nulo apareçam 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 traduzir 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 de arquivos como caracteres, por exemplo, um aplicativo que transmita os nomes por FTP, talvez seja necessário configurar esse aplicativo para informar que os nomes dos arquivos estão codificados em UTF-8. Configurar o ambiente LC_CTYPE para uma localidade UTF-8 como en_US.UTF-8 é o truque para muitos aplicativos de linha de comando.

Se você armazenar arquivos em um sistema que não suporta UTF-8, 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 copiar os arquivos de volta para um sistema que suporte UTF-8, esses mesmos bytes continuarão sendo exibidos como caracteres UTF-8.

Se você estiver escrevendo seu próprio aplicativo, usar UTF-8 internamente e, sempre que possível, armazenar e transmitir é uma boa ideia.

    
por 08.05.2012 / 03:02