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.gif
o 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 shade
in 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.
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
e python -c "import sys; print(repr(sys.argv[1]))" café.png
?