Perché i miei nomi di file sembrano "normali" in Linux ma non in remoto su Windows?


11

Mentre lavoravo con un collega ho trovato uno strano problema che sembra legato alla codifica. Stiamo lavorando con alcune immagini che hanno i nomi di file abbastanza semplici come city.gifo wine.gif, ma come ci si potrebbe aspettare le cose si complicano quando si usano caratteri speciali quali é, ë, à. Stiamo anche lavorando con dati olandesi che hanno questi caratteri, ad esempio café( pub ). (Non abbiamo il controllo sull'origine dei file.) Ecco dove iniziano a sorgere i problemi. I seguenti nomi di file sono solo un esempio. Il problema si verifica anche per altri personaggi con segni diacritici.

café-2.png
cafetaria.png
café.png

Il primo e l'ultimo oggetto dovrebbero avere una e accentata (accent aigu, é). Ecco come viene mostrato in Linux (CentOS 6 e 7) in un terminale durante l'esecuzione ls. Ma ecco che arriva Windows! (Usando Windows 10, 64 bit.) Quando ci si connette su Windows tramite SSL con il nostro server e quindi si chiama ls, l'elenco sopra appare così:

café-2.png
cafetaria.png
caf▒.png

Come si spera, la prima riga ha ancora l'accento e é , ma la terza no. Invece, vedo questo personaggio - che è medium shadein Unicode (9618 decimale). Questo è strano in sé. Tuttavia, quando mi connetto tramite SFTP con Filezilla (sempre su Windows), vedo questo:

café-2.png
cafetaria.png
café.png

Quindi ora le cose si sono capovolte: nella prima éè cambiato nella sequenza e nella terza va tutto bene. Ho trovato qui che questo è probabilmente dovuto ad un Latin-1 <-> UTF-8 di conversione che è andato storto, se ho capito bene. Ma non può essere tutto quello che succede, giusto?

Linux mostra tutto come ci aspetteremmo, Windows mostra un comportamento apparentemente incoerente a seconda del modo in cui vediamo il nome file (SSH (putty) o SFTP (filezilla)). C'è un modo per "normalizzare" questi nomi di file - cioè modificarli - e assicurarsi che siano tutti uguali su tutti i sistemi operativi; o almeno coerente, e se sì, come? UTF-8è la nostra codifica preferita.

Anche se questo può essere solo un problema estetico, non lo è. Quando provo a scaricare cose tramite SFTP in Windows dal nostro server Linux, non riesco a scaricare i file che hanno il problema sopra menzionato. Filezilla genererà un errore come Can't download file café-2.png: café-2.png does not exist on the server. Il che mi sembra che Filezilla legga la directory e il nome del file, lo interpreti in una certa codifica, invii una richiesta GET al server con la sua interpretazione, ma tale interpretazione differisce dal nome del file Linux, di conseguenza il file non viene trovato.

In definitiva sarebbe bello se ci fosse una soluzione disponibile, anche se sono anche interessato al perché questo accada. Succede perché i file di immagine sono stati probabilmente creati su diversi sistemi operativi? Si verifica perché il server Linux li interpreta in modo errato o Windows è in disordine? Speriamo che ci sia una soluzione in cui possiamo semplicemente contattare il nostro amministratore di sistema e chiedere loro di attivare un interruttore nella configurazione del server, ma temo che non sia così semplice.


1
È una questione del client (PuTTY, ecc.) E della loro configurazione e non rilevante per Windows. Per PuTTY, questo viene fatto nella sezione di traduzione .
Thomas Dickey,

2
Sembra un po 'che l'é in "café-2.png" sia codificato UTF-8, ma che in "café.png" sia codificato ISO-8859-1. Sai correre python -c "import sys; print(repr(sys.argv[1]))" café-2.pnge python -c "import sys; print(repr(sys.argv[1]))" café.png?
Oskar Skog,

@OskarSkog Lo proverò al mattino. Ma ho sempre pensato che i nomi dei file non "avessero" una codifica, in altre parole: è come lo desidera il sistema operativo. Quindi significherebbe che i diversi file sono stati creati su diversi sistemi operativi? (Non abbiamo alcun controllo sull'origine dei file.)
Bram Vanroy

Su unix come i sistemi operativi, il nome file è solo una stringa di byte. Il concetto di personaggi arriva a un livello superiore.
Oskar Skog,

1
Nemmeno vicino a una risposta, o una soluzione, semplicemente un pensiero sulla strada da perseguire. Dall'OP sembra che i file possano avere origini assortite, senza controllo sul nome generato dalla fonte, ed è troppo tardi per applicare i filtri per correggere lo snafus del nome file in arrivo. È probabile che la soluzione implichi l'esecuzione di uno script sul server in grado di rilevare e correggere gli errori dei nomi dei file, possibilmente anche la standardizzazione della serie di caratteri / tabella codici utilizzata per i nomi. Quindi l'OP può utilizzare la stessa tabella codici in Filezilla o in altri client e le cose funzioneranno. Al di là delle mie capacità, ma forse un vantaggio da seguire.
user207673

Risposte:


11

Ma ecco che arriva Windows!

Windows non ha nulla a che fare con questo. Si potrebbe riprodurre questo stesso comportamento Campione con un'istanza locale di (diciamo) Terminale GNOME, con codifica terminale opportunamente selezionati e locale opportunamente configurato per ls, senza Finestre essere nell'immagine affatto .

L'unica cosa che fa Windows è mostrare chiaramente cosa sta succedendo qui. Il tuo programma FTP di Windows sta prendendo i byte nei nomi dei file e li visualizza come punti di codice rilevanti nella tabella codici 1252. Questa, una codifica a byte singolo con quasi tutto sopra 0x1F un glifo stampabile, ci dice esattamente quali sono i byte nei tuoi nomi di file .

Il tuo secondo nome è in gran parte non informativo, ma il primo e il terzo lo dicono.

  • Il primo nome file è la sequenza di byte 63 61 66 c3 a9 2d 32 2e 70 6e 67. Nella tabella codici 1252 è café-2.png. È anche la codifica UTF-8 di café-2.png.
  • Il terzo nome file è la sequenza di byte 63 61 66 e9 2e 70 6e 67. Nella tabella codici 1252 questo è café.png. Tuttavia, non è una codifica UTF-8 valida. e9inizia una sequenza di codifica dei caratteri incompleta.

Quindi quello che sta succedendo è che le cose non stanno usando la code page 1252 ma che stanno usando UTF-8, vale a dire la tua sessione SSH e il tuo emulatore di terminale locale, stanno gestendo l' UTF-8 valido allo stesso modo l'uno dell'altro ma stanno gestendo l' invalido UTF-8 in due modi diversi:

  • Quello che sta visualizzando il grafico a blocchi molto probabilmente sta semplicemente usando quel grafico a blocchi come carattere di output di sostituzione generale per sequenze UTF-8 non valide.
  • Quello che sta visualizzando la lettera ésta tornando alla pagina di codice 1252 quando incontra una codifica non valida.

Il tuo problema di fondo è un sistema che in qualche modo sta generando alcuni nomi di file codificati come UTF-8 e altri nomi di file codificati nel codice pagina 1252.


Non sono d'accordo che Windows non abbia nulla a che fare con questo. Probabilmente non accadrà su altri Linux. Il problema è la codifica di default e afaik Windows ha (o almeno ha avuto) utilizzato il proprio CP e non UTF, determinando che questo problema si verifichi anche sullo stesso sistema operativo in tutti i paesi. Puoi riprodurlo su Linux, ma Linux è più coerente nella scelta di Unicode
MatthewRock

Ciao! Grazie per la risposta elaborata. Ti concentri su ciò che sta accadendo, il che è bello: mi piace sempre capire cosa sta succedendo. Ma potresti forse far luce sul perché ciò sta accadendo e su come possiamo contrastare i problemi che derivano da questa incoerenza? Ho aggiunto due paragrafi per chiarire cosa intendo.
Bram Vanroy

Mi chiedo perché entrambi i "caffè" siano mostrati uguali quando non lo sono. GNU's ls (1) ha una ridicola gestione degli errori di codifica?
Oskar Skog

@MatthewRock In questo caso penso che Windows non abbia davvero nulla a che fare con esso. Non sono contento della maggior parte di ciò che fa M $ e ammetto volentieri molti dei suoi mali, ma non riesco a vedere la colpa data dove nessuno è dovuto. Come la risposta chiarisce, il problema è con i valori byte dei nomi stessi. In questo caso Windows ha esposto il sintomo, ma non è questo il problema. Nient'altro che il termometro è il problema quando mostra che la tua febbre è di 104 °. Il problema ha origine con qualunque processo abbia creato i nomi sul server con i file a cui l'OP sta tentando di accedere.
user207673

Potresti fornire maggiori informazioni e possibili soluzioni? Altrimenti ho speso la mia generosità per niente.
Bram Vanroy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.