Caracteres quebrados em nomes de arquivos somente em alguns diretórios

4

Temos um servidor web rodando o CentOS 5.8 que usa o SVN para controle de versão. Ao tentar mudar para a revisão mais recente, obtivemos um erro sobre os nomes dos arquivos em um diretório de upload:

svn: Error converting entry in directory 'adm/emails/upload' to UTF-8
svn: Valid UTF-8 data
(hex: 54 79)
followed by invalid UTF-8 sequence
(hex: f6 6b 69 72)

Ao investigar, notamos que havia alguns arquivos que tinham nomes de arquivos corrompidos:

$ ls ~/public_html/adm/emails/upload/
Ty?el?m?trendit.csv
Ty?kirja1.csv

Para que a atualização seja concluída rapidamente, simplesmente mv ed os arquivos em nosso diretório pessoal. Surpreendentemente, os nomes de seus arquivos ficaram bem em sua nova localização:

$ ls ~/
Työelämätrendit.csv
Työkirja1.csv

Após a atualização, nós os movemos de volta para onde eles estavam e seus nomes de arquivos foram quebrados novamente. O que poderia causar isso e como podemos corrigi-lo? A localidade do sistema está definida para LANG=en_US.UTF-8 .

    
por Kaivosukeltaja 18.06.2012 / 08:33

1 resposta

1

O x54 x79 é o "Ty" em ASCII, que é válido ISO-8859-1 e UTF-8, mas o xF6 x6B x69 x72 é "ökir", na codificação ISO-8859-1 e NÃO é válido UTF- 8 Que está sendo traduzido das duas maneiras em algum lugar entre assustador e brilhante. O que traz a questão de saber se o sistema de arquivos está envolvido.

A maioria dos sistemas de arquivos Unix são bastante agnósticos em relação aos conjuntos de caracteres - eles simplesmente fazem bytes. Você pode verificar ambos os sistemas de arquivos, se houver dois (um não pode ser ext3), os detalhes sobre como eles são montados e descobrir se o caminho através de ~ / public_html / adm / email / upload / está passando pelo NFS ou algo como ele, que pode estar colocando em camadas outro caractere do sistema de arquivos sobre o subjacente - o Samba seria uma coisa muito interessante para se encontrar lá, já que ele tem opções explícitas de charset.

É claro que verificar se LC_CTYPE está definido de forma estranha também é uma boa ideia:

$ touch Työelämätrendit.csv
$ ls T*
Työelämätrendit.csv
$ LC_CTYPE=C ls T*
Ty??el??m??trendit.csv
$

Talvez o LC_CTYPE não tenha sido definido no processo do SVN? Não é difícil de acontecer, quando está sendo executado indiretamente por um servidor web, um trabalho em lote, etc.

    
por 07.07.2012 / 10:09