如何在C#中将字符串转换为RTF?

Ler*_*rve 13 c# rtf

如何将字符串"Européen"转换为RTF格式的字符串"Europ \'e9en"?

[TestMethod]
public void Convert_A_Word_To_Rtf()
{
    // Arrange
    string word = "Européen";
    string expected = "Europ\'e9en";
    string actual = string.Empty;

    // Act
    // actual = ... // How?

    // Assert
    Assert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我发现了什么

RichTextBox的

RichTextBox可用于某些事情.例:

RichTextBox richTextBox = new RichTextBox();
richTextBox.Text = "Européen";
string rtfFormattedString = richTextBox.Rtf;
Run Code Online (Sandbox Code Playgroud)

但是rtfFormattedString原来是整个RTF格式的文档,而不仅仅是字符串"Europ \'e9en".

堆栈溢出

谷歌

我还在网上找到了一堆其他资源,但没有解决我的问题.

回答

布拉德克里斯蒂的答案

不得不添加Trim()删除前面的空格result.除此之外,Brad Christie的解决方案似乎也有效.

我现在将使用这个解决方案,即使我有一个糟糕的直觉,因为我们必须使用SubString并修剪RichTextBox以获得RTF格式的字符串.

测试用例:

[TestMethod]
public void Test_To_Verify_Brad_Christies_Stackoverflow_Answer()
{
        Assert.AreEqual(@"Europ\'e9en", "Européen".ConvertToRtf());
        Assert.AreEqual(@"d\'e9finitif", "définitif".ConvertToRtf());
        Assert.AreEqual(@"\'e0", "à".ConvertToRtf());
        Assert.AreEqual(@"H\'e4user", "Häuser".ConvertToRtf());
        Assert.AreEqual(@"T\'fcren", "Türen".ConvertToRtf());
        Assert.AreEqual(@"B\'f6den", "Böden".ConvertToRtf());
}
Run Code Online (Sandbox Code Playgroud)

逻辑作为扩展方法:

public static class StringExtensions
{
    public static string ConvertToRtf(this string value)
    {
        RichTextBox richTextBox = new RichTextBox();
        richTextBox.Text = value;
        int offset = richTextBox.Rtf.IndexOf(@"\f0\fs17") + 8; // offset = 118;
        int len = richTextBox.Rtf.LastIndexOf(@"\par") - offset;
        string result = richTextBox.Rtf.Substring(offset, len).Trim();
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*tie 8

并不RichTextBox总是有相同的页眉/页脚?您可以根据偏移位置读取内容,并继续使用它进行解析.(我想?如果我错了,请纠正我)

有图书馆可用,但我个人从来没有好运(尽管在完全耗尽可能性之前总是找到另一种方法).此外,大多数较好的通常包括象征性的费用.


编辑
有点黑客,但这应该可以帮助您了解您需要通过的内容(我希望):

RichTextBox rich = new RichTextBox();
Console.Write(rich.Rtf);

String[] words = { "Européen", "Apple", "Carrot", "Touché", "Résumé", "A Européen eating an apple while writing his Résumé, Touché!" };
foreach (String word in words)
{
    rich.Text = word;
    Int32 offset = rich.Rtf.IndexOf(@"\f0\fs17") + 8;
    Int32 len = rich.Rtf.LastIndexOf(@"\par") - offset;
    Console.WriteLine("{0,-15} : {1}", word, rich.Rtf.Substring(offset, len).Trim());
}
Run Code Online (Sandbox Code Playgroud)

编辑2

代码RTF控制代码细分如下:

    • \f0- 使用0索引字体(列表中的第一个字体,通常是Microsoft Sans Serif(在标题中的字体表中注明:) {\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}})
    • \fs17 - 字体格式,指定大小为17(17为半分)
  • 页脚
    • \par 指定它是段落的结尾.

希望清除一些东西.;-)


Vla*_*sak 5

我就是这样走的:

private string ConvertString2RTF(string input)
{
    //first take care of special RTF chars
    StringBuilder backslashed = new StringBuilder(input);
    backslashed.Replace(@"\", @"\\");
    backslashed.Replace(@"{", @"\{");
    backslashed.Replace(@"}", @"\}");

    //then convert the string char by char
    StringBuilder sb = new StringBuilder();
    foreach (char character in backslashed.ToString())
    {
        if (character <= 0x7f)
            sb.Append(character);
        else
            sb.Append("\\u" + Convert.ToUInt32(character) + "?");
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我认为使用 aRichTextBox是:
1)过度杀伤力
2)我不喜欢RichTextBox在花了几天时间尝试让它与在 Word 中创建的 RTF 文档一起使用之后。


Mat*_*ock 5

我找到了一个很好的解决方案,它实际上使用 RichTextBox 本身来进行转换:

private static string FormatAsRTF(string DirtyText)
{
    System.Windows.Forms.RichTextBox rtf = new System.Windows.Forms.RichTextBox();
    rtf.Text = DirtyText;
    return rtf.Rtf;
}
Run Code Online (Sandbox Code Playgroud)

http://www.baltimoreconsulting.com/blog/development/easily-convert-a-string-to-rtf-in-net/