Отредактированная версия WinSCP FAQ Почему текстовые файлы переносятся неправильно после передачи или редактирования файла?
В частности, смотрите раздел « Известные проблемы ».
После передачи или редактирования файла может случиться, что разрывы строк неверны, что может проявляться как:
- Разрывы строк потеряны. Кажется, будто весь файл находится в одной строке.
- Разрывы строк дублируются. Кажется, что между каждой строкой есть дополнительная пустая строка.
- Там странный символ / символ в конце каждой строки.
Форматы текстовых файлов
Разные платформы (операционные системы) используют разные форматы текстовых файлов. Наиболее распространенными форматами являются Unix и Windows формат. Основное отличие состоит в том, что для обозначения конца строки используется другой символ или последовательность символов. В Unix это символ НЧ (\n
, 0A
или 10 в десятичном виде). В Windows это последовательность из двух символов, CR и LF (\r
+ \n
, 0D
+ 0A
или 13 + 10 в десятичном виде).
Хотя многие приложения и системы в настоящее время могут работать с обоими форматами, для некоторых требуется определенный формат. При представлении файла в другом формате они не могут правильно его отобразить, как описано выше.
Режим передачи текста /ASCII
По этой причине клиенты и серверы передачи файлов поддерживают режим передачи текста /ASCII. При передаче файла в этом режиме файл (в идеале) преобразуется из исходного формата в исходную систему в собственный формат целевой системы. Например, при загрузке текстового файла в текстовом режиме из Windows в систему Unix окончания строки файла преобразуются из CR+LF в LF.
WinSCP по умолчанию использует двоичный режим передачи для всех файлов. Узнайте, как настроить его для использования режима передачи текста /ASCII. Вам также может потребоваться настроить правильный формат текстового файла на стороне сервера.
Напротив, если вы хотите принудительно использовать WinSCP в двоичном режиме, даже при редактировании файлов в текстовом редакторе, вы должны использовать внешний текстовый редактор (внутренний редактор WinSCP не поддерживает формат файлов Unix) и настроить WinSCP так, чтобы он не заставлял текстовый режим для отредактированных файлов. Также убедитесь, что ваш внешний текстовый редактор сохраняет файл в нужном вам формате (большинство текстовых редакторов в настоящее время поддерживают различные форматы текстовых файлов, а не только формат, свойственный платформе, на которой работает редактор).
Известные проблемы с режимом передачи
- FTP-сервер Pure-FTPd: при загрузке файла с окончаниями строк Windows (CR+LF) в текстовом /ASCII-режиме сервер заменяет LF на CR+LF, что приводит к неправильному CR+CR+LF. При открытии такого файла во внутреннем редакторе WinSCP редактор интерпретирует последовательность как два конца строки (CR и CR+LF), что приводит к пустой строке после каждой строки содержимого. Когда файл сохранен, внутренний редактор сохраняет два окончания строки Windows CR+LF и CR+LF. При загрузке они конвертируются в два LF. Обходной путь - использовать внешний редактор и убедиться, что WinSCP не включает текстовый режим для отредактированных файлов.
Отладка преобразования текстовых файлов
Если включение (или отключение) режима передачи текста /ASCII не помогло с проблемой, и ваш переданный / отредактированный файл все еще неправильно воспринимается целевой системой, вам необходимо выяснить, на каком этапе файл был преобразован неправильно (или не был преобразован).
Чтобы определить окончания строк, используемые файлом в Windows, используйте следующую команду в консоли PowerShell, чтобы отобразить шестнадцатеричный дамп первых 100 символов данного файла (example.txt
):
Get-Content -Encoding Byte -TotalCount 100 example.txt |% {Write-Host ("{0:x2} " -f $_) -NoNewline}; Write-Host
Для файла со следующим содержимым в формате Windows
One
Two
он отображает:
4f 6e 65 0d 0a 54 77 6f 0d 0a
Обратите внимание на две последовательности 0d 0a
(CR + LF), указывающие формат Windows.
Чтобы определить окончания строк, используемые файлом в системе Unix/Linux, используйте команду:
xxd example.txt | head
(Альтернативы являются hexdump example.txt | head
или od example.txt | head
.)
Для того же файла, что и выше, только в формате Unix, он отображает:
0000000: 4f6e 650a 5477 6f0a One.Two.
Обратите внимание на символ 0a
(LF), обозначающий формат Unix.
Если у вас нет доступа оболочки к удаленной системе, загрузите файл с помощью двоичной кодировки и используйте команду PowerShell для локальной двоичной копии.
Используйте эти методы, чтобы определить, какой формат имеют исходные и конечные файлы. При редактировании файла определите также формат локальной временной копии отредактированного файла, сохраненный редактором. Смотрите настройки для размещения временных копий.
Запрос поддержки
Если вышеперечисленное не поможет вам понять проблему и вы решите обратиться за дополнительной поддержкой, включите все свои выводы, включая копии как исходного, так и конечного файла. При редактировании файла включайте также локальную временную копию, сохраненную редактором. Идеально сжимайте (ZIP) файлы, чтобы избежать изменения форматом файлов вашего браузера, когда прикрепляете файлы к запросу поддержки.
(Я автор WinSCP)