problema de codificação de nomes de arquivos ao migrar um aplicativo PHP do Windows Server 2003 para o Linux

2

Eu tenho alguns aplicativos PHP atualmente em execução no Windows 2003 Server. Como eles estão usando PHP, Mysql e até mesmo Apache no Windows, o projeto é movê-los para um novo servidor Linux (baseado no Debian).

Mas eu tenho um problema com arquivos carregados pelos usuários quando 'caracteres especiais' (arquivos não-ASCII, como éèçç) são usados para nomes de arquivos (o que é regular em francês).

Por exemplo, o arquivo "accusé réception.pdf" é armazenado como:

$ ls
accus? r?ception.pdf

Parece que não há problema quando eu carrego um novo arquivo no servidor Linux: o arquivo será nomeado assim no fs, mas o aplicativo pode encontrá-lo. O problema é com o conteúdo migrado, o arquivo está disponível, mas o aplicativo não consegue encontrá-lo!

Eu me pergunto de onde o problema pode vir:

  • tabela de arquivos / codificação de caracteres, acho que vem daqui
  • o código php dos próprios aplicativos, seria um problema, pois não posso alterá-lo. Eu posso enviar solicitações de bug, mas não tenho certeza de quando elas serão corrigidas.
  • outro problema

E acima de tudo, preciso encontrar uma maneira de corrigir isso. Como isso acontece apenas com dados migrados, eu poderia escrever um script ou ajustar meu fs / php / whatever para resolvê-lo ao colocar esses aplicativos em produção no servidor Linux.

Agradecemos antecipadamente por sua ajuda.

Nota: quando o aplicativo não consegue encontrar um arquivo, meus logs do Apache são preenchidos com 'readdir () espera que o parâmetro 1 seja um recurso, booleano dado em ...' errors

    
por daks 22.08.2011 / 13:34

2 respostas

0

Eu finalmente encontrei algumas informações sobre o meu problema e uma solução alternativa. A empresa que desenvolve esses aplicativos php me diz para usar o iso-8859-1 para servir os arquivos armazenados, configurando o Apache dessa maneira. Isso não resolve meu problema, mas me dá uma ideia.

Eu usei o link (graças a Como saber a codificação de idioma de um nome de arquivo no Linux? ) para converter nomes de arquivos de utf- 8 (a cópia para debian faz deles utf-8 eu acho) para iso-8859-1 com

$ convmv -f utf-8 -t iso-8859-1 --no-test -r *

Ele resolve meu problema, pois agora meus aplicativos podem encontrar os arquivos armazenados (aqueles migrados e novos).

O único problema é que no meu shell ainda não vejo corretamente os nomes dos arquivos:

$ ls 
test ��.xls

$ LANG=fr_FR.UTF-8 ls
test ??.xls

Mas esse é um problema "menor".

ps: desculpe pela pergunta original que não expôs corretamente o problema e por responder com a solução tão tarde

    
por 28.09.2011 / 10:18
0

O Windows geralmente usa unicode para codificar caracteres não-ASCII, portanto, se você estiver usando uma localidade unicode no seu servidor Debian, estará pronto. Não precisa ser francês apenas porque os personagens que você está tentando usar são uma especialidade francesa (apenas testei isso, eu tenho meu LANG configurado para en_US.UTF-8 e posso criar um arquivo com o nome que você mencionou ( "accusé réception.pdf") e mostra-se assim também.

As possibilidades são os acentos estão lá, eles simplesmente não podem ser exibidos. Para testar essa teoria, substitua o comando "ls" por "LANG = en_US.UTF8 ls". Se aparecer corretamente, é apenas o seu terminal. Basta definir sua variável LANG no arquivo de inicialização do seu shell (por exemplo, .bashrc) ou em todo o sistema em / etc / default / locale

    
por 23.08.2011 / 01:24