【问题标题】:Unexpected result of RTF line ending conversionRTF 行尾转换的意外结果
【发布时间】:2011-10-01 04:07:30
【问题描述】:

如果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

【问题讨论】:

  • 您使用的是什么类型的富文本框? WinForms、Silverlight、WPF 等?对不起。刚刚看到链接-然后是WinForms
  • @Scott:是的。 System.Windows.Forms.RichTextBox.

标签: vb.net winforms richtextbox rtf


【解决方案1】:

您对规范的解释不正确。

RTF 规范明确规定:

回车(字符值 13)或换行符(字符值 10) 如果字符前面有 一个反斜杠。您必须包含反斜杠;否则,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 没有反斜杠前缀)。

所以规范是正确和精确的。

明白了吗? ;)

(&lt;eof&gt; 表示此处的文件结尾字符,或文件结尾,无论您的文本编辑器输出什么,换行符是 CR、CR LF 或 LF,无论您的文本编辑器输出什么 :) )

为什么,因为 Microsoft 几乎一致地使用 CRLF 作为行尾, RichTextBox 会将 \par 翻译成 vbLf 而不是 vbCrLf?

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

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

(当然,这也是特定于应用程序的......我将其称为鲜为人知的兼容性噩梦之一,即换行符。)

【讨论】:

  • “这使 RTF 成为一种几乎无格式的语言,即 RTF 内容独立于换行符(即换行符不是原始文本的一部分)”我知道;我想我在我的问题中说过!
  • 问题是关于将 RTF 转换回“普通”文本以从 RichTextBox 控件中提取时转换为 CRLF 的问题;我想我很满意你回答的后半部分解释了这一点,但是当我开始工作时我会进一步考虑:)
  • “我知道;我想我在我的问题中说过了”——是的,看到了,但直到现在它还没有影响到我更有用的脑细胞。对不起。这让我 70% 的回答变得多余。呵呵。
  • 嘿,别担心;它发生了。顺便说一下,OSX 之前的 Mac 使用 CR 作为换行符。
  • 否则我觉得你的回答有道理;不过,我希望有一些文档。微软似乎并不太担心在任何其他情况下的平台兼容性,并且(正如您所指出的)翻译关注的是表单控件而不是 RTF 本身,并且表单控件可能只存在于 Windows 上!
【解决方案2】:

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

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

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

【讨论】:

  • 我知道规范,如我的问题所示。历史理论是一个有趣的理论,尽管它仍然只是推测:D
  • 对不起,但在审查时,我仍然觉得这不能真正回答我的问题。使用/par 的 RTF 很好;我更感兴趣的是为什么这会在提取时被翻译成LF(而不是在Windows平台技术上的(CRLF)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2013-10-14
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多