Vb6 如何将RTF文件拆分为行?

Vb6 如何将RTF文件拆分为行?,vb6,rtf,Vb6,Rtf,我试图将一个RTF文件分成几行(在我的代码中),但我没有完全正确,主要是因为我没有真正了解整个RTF格式。似乎行可以被\par或\pard或\par\pard或任意数量的有趣组合分割 我正在寻找一段代码,它可以将文件分割成任何语言的行 您可以尝试(请参见Wikipedia页面上的,该页面还提供了一些指向几种编程语言的示例或模块的链接) 这很可能会让您了解行插入的“单词”,这样您就可以使用一组定义良好的规则将文件拆分为行,而不是进行猜测。您见过肖恩·M·伯克的O’Reilly吗 在第13页,它说

我试图将一个RTF文件分成几行(在我的代码中),但我没有完全正确,主要是因为我没有真正了解整个RTF格式。似乎行可以被\par或\pard或\par\pard或任意数量的有趣组合分割

我正在寻找一段代码,它可以将文件分割成任何语言的行

您可以尝试(请参见Wikipedia页面上的,该页面还提供了一些指向几种编程语言的示例或模块的链接)


这很可能会让您了解行插入的“单词”,这样您就可以使用一组定义良好的规则将文件拆分为行,而不是进行猜测。

您见过肖恩·M·伯克的O’Reilly吗

在第13页,它说

以下是在RTF中放置换行符的一些经验法则:

  • 在“段落”部分中解释的每个\pard或\(命令)之前添加换行符
  • 在RTF字体表、样式表和其他类似结构(如颜色表,稍后描述)前后放置一个换行符
  • 您可以在第n个空格{,或}后放置一个换行符。(或者:在第60列后面的每个空格{,或}后放置一个换行符。)

或者你是在考虑将明文提取为行,并以明文的任何语言进行处理吗?

我编写了一个快速而肮脏的例程,它似乎适用于我能够使用的几乎任何东西。它在VB6中,但很容易翻译成其他任何东西

Private Function ParseRTFIntoLines(ByVal strSource As String) As Collection
    Dim colReturn As Collection
    Dim lngPosStart As Long
    Dim strLine As String
    Dim sSplitters(1 To 4) As String
    Dim nIndex As Long

    ' return collection of lines '

    ' The lines can be split by the following '
    ' "\par"                                  '
    ' "\par "                                 '
    ' "\par\pard "                            '

    ' Add these splitters in order so that we do not miss '
    ' any possible split combos, for instance, "\par\pard" is added before "\par" '
    ' because if we look for "\par" first, we will miss "\par\pard" '
    sSplitters(1) = "\par \pard"
    sSplitters(2) = "\par\pard"
    sSplitters(3) = "\par "
    sSplitters(4) = "\par"

    Set colReturn = New Collection

    ' We have to find each variation '
    ' We will look for \par and then evaluate which type of separator is there '

    Do
        lngPosStart = InStr(1, strSource, "\par", vbTextCompare)
        If lngPosStart > 0 Then
            strLine = Left$(strSource, lngPosStart - 1)

            For nIndex = 1 To 4
                If StrComp(sSplitters(nIndex), Mid$(strSource, lngPosStart, Len(sSplitters(nIndex))), vbTextCompare) = 0 Then
                    ' remove the 1st line from strSource '
                    strSource = Mid$(strSource, lngPosStart + Len(sSplitters(nIndex)))

                    ' add to collection '
                    colReturn.Add strLine

                    ' get out of here '
                    Exit For
                End If
            Next
        End If

    Loop While lngPosStart > 0

    ' check to see whether there is a last line '
    If Len(strSource) > 0 Then colReturn.Add strSource

    Set ParseRTFIntoLines = colReturn
End Function

你的思路是正确的,但你引用的那本书可能是在谈论RTF编码,而不是解码。根据微软的RTF规范(第7页-基本实体),换行符的位置是为了可读性。实际上,我只看过O'Reilly书的第一部分:RTF教程-只有25页,细节有点轻。296页的RTF 1.9.1规范让我害怕,但显然是一个更好的参考。谢谢,马克。我必须记住结束语。