Почему мои имена файлов выглядят «нормально» в Linux, а не удаленно в Windows?


11

Во время работы с коллегой я обнаружил странную проблему, которая, похоже, связана с кодированием. Мы работаем с некоторыми изображениями , которые имеют достаточно простые имена файлов , таких как city.gifили wine.gif, но как можно было бы ожидать , все становится более сложным при использовании специальных символов , таких как é, ë, à. Мы также работаем с голландскими данными, в которых есть эти символы, например café( паб ). (У нас нет контроля над происхождением файлов.) Здесь начинаются проблемы. Следующие имена файлов являются лишь примером. Эта проблема также возникает для других персонажей с диакритическими знаками.

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

Как вы можете видеть , надеюсь, первая линия до сих пор имеет ударение е é , но третий один не делает. Вместо этого я вижу этот символ - который medium shadeв Unicode (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? Надеемся, что есть решение, в котором мы можем просто связаться с нашим системным администратором и попросить его включить переключатель в конфигурации сервера, но, боюсь, это не так просто.


1
Это вопрос клиента (PuTTY и т. Д.), Его конфигурации и не относится к Windows. Для PuTTY это сделано в разделе перевода .
Томас Дики

2
Похоже, что в "café-2.png" кодируется UTF-8, а в "café.png" - ISO-8859-1. Вы можете запустить python -c "import sys; print(repr(sys.argv[1]))" café-2.pngи python -c "import sys; print(repr(sys.argv[1]))" café.png?
Оскар Ског

@OskarSkog Я попробую это утром. Но я всегда думал, что имена файлов не имеют кодировки, другими словами: это так, как этого хочет ОС. Значит ли это, что разные файлы были созданы в разных ОС? (Мы не контролируем происхождение файлов.)
Брэм Ванрой,

В Unix-подобных операционных системах имя файла представляет собой просто строку байтов. Концепция персонажей выходит на более высокий уровень.
Оскар Ског

1
Даже близко к ответу или решению, просто мысль о том, что нужно искать. Из OP кажется, что файлы могут иметь различное происхождение, без контроля над именем, сгенерированным источником, и уже слишком поздно применять фильтры для исправления входящего имени файла snafus. Решение может заключаться в запуске сценария на сервере, который может обнаруживать и исправлять ошибки имен файлов, возможно, даже стандартизируя набор символов / кодовую страницу, используемую для имен. Тогда OP может использовать ту же кодовую страницу в Filezilla или другом клиенте, и все будет работать. Помимо моих навыков, но, возможно, следствие.
user207673

Ответы:


11

Но здесь идет Windows!

Windows не имеет ничего общего с этим. Вы можете воспроизвести это же точное поведение с локальным экземпляром (скажет) GNOME Terminal, с соответствующим выбранным терминалом кодированием и соответствующим образом настроенными локал для ls, без какого - либо Windows , будучи в картине вообще .

Единственное, что делает Windows, это четко показывает, что здесь происходит. Ваша FTP-программа для Windows берет байты в именах файлов и отображает их как соответствующие кодовые точки в кодовой странице 1252. Это однобайтовая кодировка с почти всем, что больше 0x1F для печатаемого глифа, точно говорит нам, какие байты в ваших именах файлов ,

Ваше второе имя файла в значительной степени неинформативно, но первое и третье говорят.

  • Первое имя файла - это последовательность байтов 63 61 66 c3 a9 2d 32 2e 70 6e 67- в кодовой странице 1252 это так café-2.png. Это также кодировка UTF-8 café-2.png.
  • Третье имя файла - это последовательность байтов 63 61 66 e9 2e 70 6e 67- в кодовой странице 1252 это так café.png. Это, однако, не является действительной кодировкой UTF-8. e9начинается неполная последовательность кодирования символов.

Таким образом, все происходит не с использованием кодовой страницы 1252, а с использованием UTF-8, а именно сеанс SSH и эмулятор локального терминала, обрабатывают действительный UTF-8 так же, как друг друга, но обрабатывают недопустимый UTF-8 двумя различными способами:

  • Тот, который отображает графику блока, очень просто использует эту графику блока в качестве основного выходного символа замены для недопустимых последовательностей UTF-8.
  • Тот, который отображает букву, éвозвращается к кодовой странице 1252, когда обнаруживает недопустимую кодировку.

Ваша основная проблема - это система, которая каким-то образом генерирует некоторые имена файлов, закодированные как UTF-8, и другие имена файлов, закодированные в кодовой странице 1252.


Я не согласен с тем, что Windows не имеет к этому никакого отношения. Скорее всего, это не произойдет на других Linux. Проблема заключается в кодировке по умолчанию, и на самом деле Windows использовала (или, по крайней мере, использовала) свой CP, а не UTF, в результате чего эта проблема возникает даже в одной и той же ОС в разных странах. Вы можете воспроизвести это в Linux, но Linux более последовательно выбирает Unicode
MatthewRock

Всем привет! Спасибо за подробный ответ. Вы сосредотачиваетесь на том, что происходит, что приятно: мне всегда нравится понимать, что происходит. Но не могли бы вы пролить свет на то, почему это происходит, и как мы можем противостоять проблемам, вытекающим из этого несоответствия? Я добавил два абзаца, чтобы уточнить, что я имею в виду.
Брэм Ванрой

Интересно, почему оба "кафе" показаны одинаковыми, когда их нет. Есть ли в GNU ls (1) нелепая обработка ошибок кодирования?
Оскар Ског

@ MatthewRock В этом случае я думаю, что Windows действительно не имеет к этому никакого отношения. Я не доволен большей частью того, что делает M $, и охотно признаю многие из его зол, но я не вижу вины, когда ничего не происходит. Как ясно из ответа, проблема заключается в байтовых значениях самих имен. В этом случае Windows выявила симптом, но это не проблема. Проблема заключается не только в термометре, когда он показывает, что у вас температура 104 °. Проблема возникает с любыми процессами, создавшими имена на сервере, который имеет файлы, к которым пытается обратиться OP.
user207673

Не могли бы вы предоставить больше информации и возможных решений? В противном случае я потратил свою награду даром.
Брэм Ванрой
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.