#linux #vim #character-encoding #diff #flat-file
#linux #vim #кодировка символов #разница #плоский файл
Вопрос:
Название на самом деле не является конкретным, но у меня возникают проблемы с определением правильных ключевых слов, поскольку я не уверен, что здесь происходит. По той же причине возможно, что мой вопрос имеет дубликат, как . Если это так: извините!
У меня есть приложение Linux, которое получает данные через плоские файлы. Я не знаю точно, как создаются эти файлы, но я могу прочитать их без каких-либо проблем. Это короткие файлы, всего по строке в каждом.
В целях тестирования я попытался изменить один из этих файлов и повторно вставил его в приложение. Но когда я это делаю, я вижу в журнале, что он добавил таинственный разрыв страницы в конце сообщения (в результате приложение не распознает сообщение)…
Для примера, допустим, я получаю плоский файл с именем original, который содержит следующее:
ABCDEF
Я создаю копию этого файла и называю его copy .
- Если я сравниваю эти два файла с помощью команды «diff», он говорит, что они идентичны (как я и ожидал)
- Если я открываю copy через Vi, а затем завершаю работу, ничего не изменяя и не сохраняя, а затем использую команду «diff», она говорит, что они идентичны (как я и ожидал).
- Если я открою copy через Vi, а затем сохраню его, ничего не меняя, а затем использую команду «diff», у меня получится следующее (я добавил точку для целей макета):
diff original copy
1c1
< ABCDEF
No newline at end of file
---
.> ABCDEF
И если я сравню размер моих двух файлов, я увижу, что оригинал равен 71 байту, а копия — 72.
Похоже, что формат файла меняется, когда я сохраняю файл. Сначала я подумал о проблеме с кодировкой, поэтому я использовал команду «: set list» в Vim, чтобы увидеть невидимые символы. Но для обоих файлов я вижу следующее:
ABCDEF$
Я нашел другие способы выполнить свой тест, но эта проблема все еще не давала мне покоя, и я действительно хотел бы разобраться в ней. Итак, мои два вопроса:
- Что здесь происходит?
- Как я могу изменить такой файл, не создавая этот таинственный разрыв страницы?
Спасибо вам за вашу помощь!
Комментарии:
1.
vi
является редактором строк. Если файл не заканчивается на новой строке (n
, ASCII 10), тоvi
добавляется одна строка. Это ваш один дополнительный байт. Если вам это не нравится, используйте другой редактор, например Emacs.
Ответ №1:
Что происходит, так это то, что Vim по умолчанию настроен так, чтобы предполагать, что файлы, которые вы редактируете, заканчиваются символом «новой строки». Это нормальное поведение в UNIX-среде. Но «файлы», которые читает ваша программа, для меня больше похожи на «потоки», потому что они не заканчиваются символом новой строки.
Чтобы убедиться, что эти «файлы» записываются без символа новой строки, установите следующие параметры перед записью:
:set binary noeol
Смотрите :help 'eol'
.
Комментарии:
1. С
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Jun 14 2016 16:06:49)
помощью компьютера Mac я нахожу, что правильными вариантами являются::set binary noendofline
и это:set binary noeol
не имеет никакого эффекта.