Ao trabalhar com um colega, encontrei um problema estranho que parece relacionado à codificação. Estamos trabalhando com algumas imagens que têm nomes de arquivos suficientes simples, como city.gif
ou wine.gif
, mas como se poderia esperar que as coisas ficam mais complicadas quando utilizar caracteres especiais, como é
, ë
, à
. Também estamos trabalhando com dados holandeses que possuem esses caracteres, por exemplo café
( pub ). (Não temos controle sobre a origem dos arquivos.) Aqui é onde os problemas começam a surgir. Os seguintes nomes de arquivo são apenas um exemplo. O problema também ocorre para outros caracteres com sinais diacríticos.
café-2.png
cafetaria.png
café.png
O primeiro e o último item devem ter um e acentuado (acentuação aigu, é
). É assim que é mostrado no Linux (CentOS 6 e 7) em um terminal durante a execução ls
. Mas aqui vem o Windows! (Usando o Windows 10, 64 bits.) Quando conectado no Windows por SSL com o servidor e depois ligando ls
, a lista acima fica assim:
café-2.png
cafetaria.png
caf▒.png
Como você pode ver, a primeira linha ainda tem o e acentuado é
, mas a terceira não. Em vez disso, vejo ▒
esse caractere - que está medium shade
em unicode (9618 decimal). Isso é estranho em si. No entanto, quando eu me conecto através do SFTP com o Filezilla (ainda no Windows), vejo o seguinte:
café-2.png
cafetaria.png
café.png
Então agora as coisas é
mudaram : no primeiro, mudou para a sequência e no terceiro está tudo bem. Eu descobri aqui que isso provavelmente ocorre devido a uma conversão de Latin-1 <-> UTF-8 que deu errado, se eu entendi direito. Mas isso não pode ser tudo o que está acontecendo, certo?
O Linux mostra tudo o que esperávamos, o Windows mostra um comportamento aparentemente inconsistente, dependendo da maneira como visualizamos o nome do arquivo (SSH (putty) ou SFTP (filezilla)). Existe uma maneira de "normalizar" esses nomes de arquivos - ou seja, editá-los - e garantir que eles sejam iguais em todos os sistemas operacionais; ou pelo menos consistente, e se sim, como? UTF-8
é a nossa codificação de escolha.
Mesmo que isso possa ser apenas uma questão estética, não é. Ao tentar fazer o download de coisas através do SFTP no Windows em nosso servidor Linux, não consigo baixar os arquivos com o problema mencionado acima. O Filezilla lançará um erro como Can't download file café-2.png: café-2.png does not exist on the server
. O que me parece que o Filezilla lê o diretório e o nome do arquivo, interpreta-o em alguma codificação, envia uma solicitação GET ao servidor com sua interpretação, mas essa interpretação difere do nome do arquivo Linux, portanto, o arquivo não é encontrado.
Por fim, seria bom se houvesse uma solução disponível, mesmo que eu também esteja interessado em saber por que isso acontece. Isso ocorre porque os arquivos de imagem foram possivelmente criados em diferentes sistemas operacionais? Isso ocorre porque o servidor Linux os interpreta errado ou o Windows está estragando? Espero que exista uma solução em que possamos simplesmente entrar em contato com o administrador do sistema e solicitar que ele ative um switch na configuração do servidor, mas acho que não é tão fácil assim.
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
e python -c "import sys; print(repr(sys.argv[1]))" café.png
?