Неожиданный результат преобразования конца строки RTF - PullRequest
2 голосов
/ 08 июля 2011

Если txtLog является элементом управления RichTextBox:

Dim text = "hi" & vbCrLf
Debug.WriteLine("t:" & text.Length)        ' --> 4, as expected

txtLog.Text = text
Debug.WriteLine("tL:" & txtLog.TextLength) ' --> 3. muh?! :(

Если посмотреть на спецификацию RTF , конец абзаца обозначается как\par, что не является ни CR, ни LF.Это имеет смысл, поскольку RTF является языком разметки;как и в HTML, окончания строк сами по себе не имеют большого значения.

Так что, предположительно, при записи в RichTextBox мой конец строки кодируется в \par.И затем, при извлечении, \par переводится обратно в реальную строку, заканчивающуюся для использования.

Оказывается, это окончание строки vbLf.

ПочемуТак как Microsoft почти последовательно использует CRLF для окончаний строк, RichTextBox переведет \par в vbLf вместо vbCrLf?

Ответы [ 2 ]

2 голосов
/ 21 августа 2011

Непосредственная причина, по которой RichTextBox реализован таким образом, заключается в том, что спецификация RTF обозначает, что возврат каретки (сам по себе) или перевод строки сам по себе эквивалентен \par.

.,,Возврат каретки (символьное значение 13) или перевод строки (символьное значение 10) будут рассматриваться как элемент управления \ par.,.

Относительно того, почему Microsoft сделала такую ​​спецификацию, я точно не знаю.Однако я бы предположил, что это связано с тем фактом, что первая версия RTF была разработана для версии Microsoft Office для Mac в 1980-х годах.Я предполагаю, что они разработали это правило, чтобы оно работало на Mac или работало как кроссплатформенный формат в целом.Если это так, то Microsoft, вероятно, будет очень неохотно пересматривать спецификации в ближайшие годы (90-е, 00-е и т. Д.), Чтобы они соответствовали стандартным концам строк Windows (поскольку в целом у Microsoft есть история попыток поддержки в обратном направлении).максимально возможная совместимость для подобных вещей).

0 голосов
/ 26 августа 2011

Ваша интерпретация спецификации неверна.

Спецификация RTF ясно говорит:

Возврат каретки (символьное значение 13) или перевод строки (символьное значение) 10) будет рассматриваться как элемент управления \ par, если перед символом стоит обратный слеш Вы должны включить обратную косую черту; в противном случае RTF игнорирует контрольное слово. (Вы также можете вставить пара возврат каретки / перевод строки без обратной косой черты как минимум каждые 255 символы для лучшей передачи текста по линиям связи.)

Это делает RTF почти безформатным языком, т.е. Содержимое RTF не зависит от разрывов строк (т.е. символы новой строки не являются частью необработанного текста) :

Hi
\par
guys
\par<eof>

совпадает с

Hi\par\guys\par<eof>

т.е. Ваш читатель должен рассматривать все CR и LF, которые не имеют обратной косой черты, в качестве пробелов.

Hi
\
guys
\
<eof>

будет - если символ новой строки - CR + LF - пусть префиксные символы CR будут обрабатываться как токен \par, а все символы LF будут обрабатываться как пробельные символы (поскольку для LF нет префикса обратной косой черты ).

Итак, спецификация правильная и точная.

Понял? ;)

(<eof> обозначает здесь символ конца файла или конец файла, независимо от того, что выдает ваш текстовый редактор, а символ новой строки - CR, CR LF или LF, от того, что выдает ваш текстедитор :) )

Почему, поскольку Microsoft почти последовательно использует CRLF для окончаний строк, RichTextBox будет переводить \ par в vbLf вместо vbCrLf?

Только в Windows новые строки являются CRLF. На других платформах / в некоторых приложениях это только LF. Нет платформы, использующей CR только как символ новой строки. Однако существуют платформы, которые одинаково обрабатывают CR и LF, то есть CRLF - это две новые строки. В других случаях CR игнорируется, если сразу за ним следует LF (обычно это приложения Windows).

Поведение, которое вы видите, - единственный способ убедиться, что текстовый результат приводит к одинаковому числу новых строк практически на всех платформах.

(Конечно, это также зависит от приложения ... Я бы назвал это одним из малоизвестных кошмаров о совместимости, этим беспорядком новой строки.)

...