Почему «Новая строка» занимает два символа? - PullRequest
0 голосов
/ 17 января 2019

Я создал файл .txt (UTF-8) и поместил в него следующий текст:

123
456
789

Затем я попытался выяснить положение символа '4' с помощью функции InStr(). Удивительно, но результат был 6. Я попробовал с символом «3», а результат - 3. Итак, между 3 и 4 должно быть два символа.

Затем я попытался InStr(TextBox1.Text, Chr(13)), и результат составил 4.

Ok. «Новая линия» имеет персонажа, расположенного на 4-й позиции. Если да, то что там за 5-й символ?

1 Ответ

0 голосов
/ 18 января 2019

Фактические символы, используемые для новой строки, отличаются от одной платформы к другой. Некоторые системы используют символ 13 для обозначения новой строки, некоторые используют 10, а некоторые, например Windows, используют оба.

Технически символ 13 должен означать возврат каретки (верните печатающую головку принтера в левую часть страницы), поэтому его часто называют CR. Помните, что на заре вычислительной техники принтеры использовались в качестве терминалов, а не видеоэкранов. Таким образом, ближайший эквивалент CR на видеотерминале - курсор вернется к началу текущей строки, но не перейдет к следующей строке.

Символ 10 означает перевод строки (LF), что означает продвижение (то есть подачу) бумаги на одну строку, чтобы печатающая головка была готова к печати на следующей строке. Ближайшим эквивалентом перевода строки на видеотерминале является перемещение курсора вниз на следующую строку, но удержание его в той же позиции x.

Итак, имея в виду эти две вещи, если вы хотите начать печатать в начале следующей строки, вам нужно будет сделать обе вещи. Вам необходимо перейти к следующей строке на странице И вернуться к началу строки, следовательно, CRLF, два символа.

Предположительно, некоторые системные дизайнеры считали слишком расточительным использование двух символов для каждой новой строки, когда добавленный нюанс редко требовался для компьютеров с видеодисплеями, поэтому они решили использовать только CR или LF , Поскольку правильная кодировка для использования меняется с одной платформы на другую, лучше использовать Environment.NewLine в .NET, чтобы получить то, что подходит для текущей системы.

Рассмотрим, например, при запуске этого консольного приложения в Windows:

Public Sub Main()
    Console.Write("123" & vbCr)
    Console.Write("4" & vbCr)
End Sub

Вывод:

423

Возврат каретки только заставил курсор вернуться к началу строки. Это не заставило его переместиться на следующую строку, поэтому 4 при печати перезаписывает 1.

...