Працюючи з колегою, я виявив дивну проблему, яка, здається, пов'язана з кодуванням. Ми працюємо з деякими зображеннями , які мають досить прості імена файлів , таких як city.gif
або wine.gif
, але як можна було б очікувати , все стає більш складним при використанні спеціальних символів , таких як é
, ë
, à
. Ми також працюємо з голландськими даними, які містять ці символи, наприклад café
( pub ). (У нас немає контролю над походженням файлів.) Ось де починають виникати проблеми. Наступні назви файлів - лише приклад. Проблема виникає і для інших персонажів з діакритикою.
café-2.png
cafetaria.png
café.png
На першому та останньому елементі має бути наголос e там (наголос aigu, é
). Ось як це показано в Linux (CentOS 6 і 7) в терміналі під час роботи ls
. Але ось приходить Windows! (Використовуючи Windows 10, 64 біт.) Підключившись у Windows через SSL до нашого сервера, а потім зателефонувавши ls
, наведений вище список виглядає так:
café-2.png
cafetaria.png
caf▒.png
Як можна сподіватися, перший рядок все ще має наголос e é
, а третій - ні. Натомість я бачу ▒
цей символ - який знаходиться medium shade
в унікоді (9618 десятків). Це само по собі дивно. Однак, коли я з'єднуюся через SFTP з Filezilla (все ще в Windows), я бачу це:
café-2.png
cafetaria.png
café.png
Тож тепер все обернулося: у першому é
змінилося на послідовність, а в третьому все добре. Я знайшов тут , що це , швидше за все , з - за Latin-1 <-> UTF-8 перетворення , що пішло не так, якщо я отримав це право. Але це не може бути все, що відбувається, правда?
Linux показує все, як ми очікували, Windows демонструє, здавалося б, непослідовну поведінку залежно від способу перегляду імені файлу (SSH (putty) або SFTP (filezilla)). Чи є спосіб «нормалізувати» ці назви файлів - тобто відредагувати їх - і переконатися, що вони однакові у всіх ОС; або принаймні послідовне, і якщо так, то як? UTF-8
- це наше кодування за вибором.
Хоча це може бути просто естетичним питанням, це не так. При спробі завантажувати речі через SFTP в Windows з нашого сервера Linux, я не можу завантажувати файли, які мають проблему, згадану вище. Filezilla видасть помилку типу Can't download file café-2.png: café-2.png does not exist on the server
. Мені здається, що Filezilla читає каталог та ім'я файлу, інтерпретує його в деякому кодуванні, надсилає на сервер запит GET з його інтерпретацією, але ця інтерпретація відрізняється від імені файлу Linux, тому файл не знайдений.
Зрештою, було б добре, якщо є рішення, хоча мене також цікавить, чому це відбувається. Це трапляється через те, що файли зображень, можливо, створювалися в різних операційних системах? Це трапляється через те, що сервер Linux трактує їх неправильно, або Windows плутається? Сподіваємось, існує рішення, де ми можемо просто зв’язатися з нашим sysadmin та попросити їх увімкнути комутатор у конфігурації сервера, але я боюся, що це не так просто.
python -c "import sys; print(repr(sys.argv[1]))" café-2.png
і python -c "import sys; print(repr(sys.argv[1]))" café.png
?