¿Por qué los nombres de mis archivos se ven 'normales' en Linux pero no de forma remota en Windows?

11

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.gifo 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 shadeen 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-8es 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.

Bram Vanroy
fuente
1
Es una cuestión del cliente (PuTTY, etc.), y su configuración, y no es relevante para Windows. Para PuTTY, eso se hace en la sección de traducción .
Thomas Dickey
2
Parece un poco así que la é en "café-2.png" está codificada en UTF-8, pero la é en "café.png" está codificada en ISO-8859-1. ¿Puedes correr python -c "import sys; print(repr(sys.argv[1]))" café-2.pngy python -c "import sys; print(repr(sys.argv[1]))" café.png?
Oskar Skog
@ OskarSkog Lo intentaré por la mañana. Pero siempre pensé que los nombres de archivo no 'tenían' una codificación, en otras palabras: es como el sistema operativo lo quiere. Entonces, ¿eso significaría que los diferentes archivos se crearon en diferentes sistemas operativos? (No tenemos control sobre el origen de los archivos.)
Bram Vanroy
En sistemas operativos tipo Unix, el nombre de archivo es solo una cadena de bytes. El concepto de personajes llega a un nivel superior.
Oskar Skog
1
Ni siquiera cerca de una respuesta, o una solución, simplemente un pensamiento sobre el camino a seguir. Desde el OP, parece que los archivos pueden tener una variedad de orígenes, sin control sobre el nombre generado por la fuente, y es demasiado tarde para aplicar filtros para corregir el nombre de archivo entrante snafus. Es probable que la solución implique ejecutar un script en el servidor que pueda detectar y corregir errores de nombre de archivo, posiblemente incluso estandarizando el juego de caracteres / página de códigos utilizada para los nombres. Luego, el OP puede usar la misma página de códigos en Filezilla u otro cliente, y las cosas funcionarán. Más allá de mis habilidades, pero una pista a seguir, tal vez.
user207673

Respuestas:

11

¡Pero aquí viene Windows!

Windows no tiene nada que ver con esto. Se podría reproducir este mismo comportamiento exacto con una instancia local de (digamos) Terminal de GNOME, con la codificación del terminal seleccionado apropiadamente y la configuración regional debidamente configurado para ls, sin ningún tipo de Windows estar en la imagen en absoluto .

Lo único que hace Windows es mostrar claramente lo que está sucediendo aquí. Su programa FTP de Windows toma los bytes en los nombres de archivo y los muestra como los puntos de código relevantes en la página de códigos 1252. Esto, una codificación de un solo byte con casi todo por encima de 0x1F un glifo imprimible, nos dice exactamente cuáles son los bytes en sus nombres de archivo .

Su segundo nombre de archivo es poco informativo, pero el primero y el tercero son reveladores.

  • El primer nombre de archivo es la secuencia de bytes 63 61 66 c3 a9 2d 32 2e 70 6e 67. En la página de códigos 1252 es esta café-2.png. También es la codificación UTF-8 de café-2.png.
  • El tercer nombre de archivo es la secuencia de bytes 63 61 66 e9 2e 70 6e 67. En la página de códigos 1252 es esta café.png. Sin embargo, no es una codificación UTF-8 válida. e9comienza una secuencia de codificación de caracteres incompleta.

Entonces, lo que está sucediendo es que las cosas no están usando la página de códigos 1252 sino que están usando UTF-8, es decir, su sesión SSH y su emulador de terminal local, están manejando el UTF-8 válido de la misma manera que el otro, pero están manejando el UTF-8 no válido de dos maneras diferentes:

  • El que muestra el gráfico de bloque probablemente esté usando ese gráfico de bloque como el carácter de salida de reemplazo general para secuencias UTF-8 no válidas.
  • El que muestra la letra évuelve a la página de códigos 1252 cuando encuentra una codificación no válida.

Su problema subyacente es un sistema que de alguna manera genera algunos nombres de archivos codificados como UTF-8 y otros nombres de archivos codificados en la página de códigos 1252.

JdeBP
fuente
No estoy de acuerdo con que Windows no tenga nada que ver con esto. Probablemente no suceda en otros Linux. El problema es la codificación predeterminada, y afaik Windows ha usado (o al menos ha usado) su CP y no UTF, lo que hace que este problema ocurra incluso en el mismo sistema operativo en todos los países. Puede reproducir esto en Linux, pero Linux es más consistente al elegir Unicode
MatthewRock
¡Hola! Gracias por la elaborada respuesta. Te enfocas en lo que está sucediendo, lo cual es bueno: siempre me gusta entender lo que está sucediendo. Pero, ¿podría arrojar una luz sobre por qué sucede esto y cómo podemos contrarrestar los problemas que se derivan de esta inconsistencia? He agregado dos párrafos para aclarar lo que quiero decir.
Bram Vanroy
Me pregunto por qué ambos "cafés" se muestran como iguales cuando no lo son. ¿El ls (1) de GNU tiene un manejo de errores de codificación ridículo?
Oskar Skog
@MatthewRock En este caso, creo que Windows realmente no tiene nada que ver con eso. No estoy contento con la mayoría de lo que hace M $, y de buena gana admito muchos de sus males, sin embargo, no puedo ver la culpa dada a nadie. Como la respuesta deja en claro, el problema está en los valores de bytes de los propios nombres. En este caso, Windows expuso el síntoma, pero no es el problema. El problema no es más que el termómetro cuando muestra que la fiebre es de 104 °. El problema se origina con cualquier proceso que haya creado los nombres en el servidor que tiene los archivos a los que el OP está intentando acceder.
user207673
¿Podría proporcionar más información y posibles soluciones? De lo contrario, he gastado mi recompensa por nada.
Bram Vanroy