Mientras trabajaba con un colega encontré un problema extraño que parece estar relacionado con la codificación. Estamos trabajando con algunas imágenes que tienen nombres de archivo bastantes simples, tales como city.gif
o wine.gif
, pero como era de esperar cosas se complican más cuando se utilizan caracteres especiales como é
, ë
, à
. También estamos trabajando con datos holandeses que tienen estos caracteres, por ejemplo café
( pub ). (No tenemos control sobre el origen de los archivos). Aquí es donde comienzan a surgir los problemas. Los siguientes nombres de archivo son solo un ejemplo. El problema también ocurre para otros personajes con signos diacríticos.
café-2.png
cafetaria.png
café.png
El primer y último elemento debe tener una e acentuada allí (acento aigu, é
). Así se muestra en Linux (CentOS 6 y 7) en un terminal cuando se ejecuta ls
. ¡Pero aquí viene Windows! (Usando Windows 10, 64 bit.) Cuando se conecta en Windows a través de SSL con nuestro servidor y luego llama ls
, la lista anterior se ve así:
café-2.png
cafetaria.png
caf▒.png
Como puede ver, la primera línea todavía tiene la e acentuada é
, pero la tercera no. En cambio, veo ▒
este carácter, que está medium shade
en Unicode (9618 decimal). Esto es extraño en sí mismo. Sin embargo, cuando me conecto a través de SFTP con Filezilla (todavía en Windows) puedo ver esto:
café-2.png
cafetaria.png
café.png
Así que ahora las cosas han cambiado: en el primero, é
ha cambiado a la secuencia y en el tercero todo está bien. Encontré aquí que esto probablemente se deba a una conversión Latin-1 <-> UTF-8 que salió mal, si lo hice bien. Pero eso no puede ser todo lo que está pasando, ¿verdad?
Linux muestra todo como esperamos, Windows muestra un comportamiento aparentemente inconsistente dependiendo de la forma en que vemos el nombre del archivo (SSH (masilla) o SFTP (filezilla)). ¿Hay alguna manera de 'normalizar' estos nombres de archivo, es decir, editarlos, y asegurarse de que sean todos iguales en cada sistema operativo? o al menos consistente, y si es así, ¿cómo? UTF-8
es nuestra codificación de elección.
Aunque esto puede ser simplemente un problema estético, no lo es. Al intentar descargar cosas a través de SFTP en Windows desde nuestro servidor Linux, no puedo descargar los archivos que tienen el problema mencionado anteriormente. Filezilla arrojará un error como Can't download file café-2.png: café-2.png does not exist on the server
. Lo que me parece que Filezilla lee el directorio y el nombre del archivo, lo interpreta con alguna codificación, envía una solicitud GET al servidor con su interpretación, pero esa interpretación difiere del nombre del archivo de Linux, por lo que no se encuentra el archivo.
En última instancia, sería bueno si hay una solución disponible, aunque también estoy interesado en por qué sucede esto. ¿Ocurre porque los archivos de imagen posiblemente se crearon en diferentes sistemas operativos? ¿Ocurre porque el servidor Linux los interpreta mal o Windows está estropeando? Esperemos que haya una solución en la que podamos contactar a nuestro administrador de sistemas y pedirles que activen un interruptor en la configuración del servidor, pero me temo que no es tan fácil como eso.
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
y python -c "import sys; print(repr(sys.argv[1]))" café.png
?