RTF行结束转换的意外结果

时间:2011-07-08 10:17:27

标签: vb.net winforms richtextbox rtf

如果txtLogRichTextBox控件:

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

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

查看the RTF spec后,段落的结尾标记为\par,既不是CR也不是LF。这是有道理的,因为RTF是标记语言;就像在HTML中一样,行结尾本身没什么意义。

因此,大概在写入RichTextBox时,我的行结尾被编码为\par。然后,在提取时,\par被转换回实际结束以供使用。

事实证明,此行结尾为vbLf

为什么,由于Microsoft几乎始终如一地使用CRLF进行行结算,会RichTextBox\par翻译为vbLf而不是vbCrLf?< /强>

2 个答案:

答案 0 :(得分:2)

以这种方式实现RichTextBox的直接原因是因为RTF specification表示回车符(单独使用)或换行符本身等同于\par

  

。 。 。回车符(字符值13)或换行符(字符值10)将被视为\ par控件。 。

至于为什么微软会制定这样的规范,我不确定。但是,我推测这与first version of RTF是在20世纪80年代为Mac版Microsoft Office开发的事实有关。我猜他们开发了这个标准规则,以便它在Mac上运行良好,或者作为一般的跨平台格式运行良好。如果是这种情况,那么微软可能会非常犹豫在未来几年('90年代,'00年代等)修改规范以匹配标准的Windows线路结束(因为一般来说,微软有试图向后支持的历史尽可能兼容这样的事情。)

答案 1 :(得分:0)

您对规范的解释不正确。

RTF规范清楚地说:

  

回车(字符值13)或换行符(字符值   如果字符前面有,则将被视为\ 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,无论您的texteditor吐出什么:))

  

为什么,因为微软几乎一直采用CRLF进行线路结束,   RichTextBox会将\ par转换为vbLf而不是vbCrLf吗?

仅限Windows上的新行是CRLF。在其他平台/某些应用程序中,它只是LF。没有平台仅使用CR作为换行符。但是,有一些平台可以同等地处理CR和LF,即CRLF是那里的两个换行符。在其他情况下,如果紧接着是LF(通常包括Windows应用程序),则忽略CR。

您看到的行为是确保文本结果在几乎所有平台上生成相同数量的换行符的唯一方法。

(当然,这也是特定于应用程序的...我称这是一个鲜为人知的兼容性噩梦,即新行混乱。)