如何在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); } 

到目前为止我发现了什么

RichTextBox的

RichTextBox可用于某些事情。 例:

 RichTextBox richTextBox = new RichTextBox(); richTextBox.Text = "Européen"; string rtfFormattedString = richTextBox.Rtf; 

但是rtfFormattedString原来是整个RTF格式的文档,而不仅仅是字符串“Europ \’e9en”。

堆栈溢出

  • 将带有特殊字符的字符串插入RTF
  • 如何将unicode字符串输出到RTF(使用C#)
  • 将RTF特殊字符输出为Unicode
  • 转换RTF的特殊字符 (iPhone)

谷歌

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

回答

布拉德克里斯蒂的答案

必须添加Trim()以删除result中的前一个空格。 除此之外,布拉德克里斯蒂的解决方案似乎有效。

我现在将使用这个解决方案,即使我有一个糟糕的直觉,因为我们必须使用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()); } 

逻辑作为扩展方法:

 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; } } 

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()); } 

编辑2

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

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

希望清除一些东西。 😉

这就是我去的方式:

 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(); } 

我认为使用RichTextBox是:
1)矫枉过正
2)我花了几天的时间尝试使用在Word中创建的RTF文档,我不喜欢RichTextBox

下面是将字符串转换为RTF字符串的丑陋示例:

 class Program { static RichTextBox generalRTF = new RichTextBox(); static void Main() { string foo = @"Européen"; string output = ToRtf(foo); Trace.WriteLine(output); } private static string ToRtf(string foo) { string bar = string.Format("!!@@!!{0}!!@@!!", foo); generalRTF.Text = bar; int pos1 = generalRTF.Rtf.IndexOf("!!@@!!"); int pos2 = generalRTF.Rtf.LastIndexOf("!!@@!!"); if (pos1 != -1 && pos2 != -1 && pos2 > pos1 + "!!@@!!".Length) { pos1 += "!!@@!!".Length; return generalRTF.Rtf.Substring(pos1, pos2 - pos1); } throw new Exception("Not sure how this happened..."); } } 

我知道它已经有一段时间了,希望这会有所帮助..

在尝试了我可以完成的每个转换代码之后,此代码对我有用:

titleText和contentText是填充在常规TextBox中的简单文本

 var rtb = new RichTextBox(); rtb.AppendText(titleText) rtb.AppendText(Environment.NewLine); rtb.AppendText(contentText) rtb.Refresh(); 

rtb.rtf现在持有rtf文本。

以下代码将保存rtf文本,并允许您打开文件,编辑它,然后再将其加载回RichTextBox:

 rtb.SaveFile(path, RichTextBoxStreamType.RichText); 

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

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

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

不是最优雅,但非常优化和快速的方法:

 public static string PlainTextToRtf(string plainText) { if (string.IsNullOrEmpty(plainText)) return ""; string escapedPlainText = plainText.Replace(@"\", @"\\").Replace("{", @"\{").Replace("}", @"\}"); escapedPlainText = EncodeCharacters(escapedPlainText); string rtf = @"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard "; rtf += escapedPlainText.Replace(Environment.NewLine, "\\par\r\n ") + ; rtf += " }"; return rtf; } 

编码字符(波兰语)方法:

 private static string EncodeCharacters(string text) { if (string.IsNullOrEmpty(text)) return ""; return text .Replace("ą", @"\'b9") .Replace("ć", @"\'e6") .Replace("ę", @"\'ea") .Replace("ł", @"\'b3") .Replace("ń", @"\'f1") .Replace("ó", @"\'f3") .Replace("ś", @"\'9c") .Replace("ź", @"\'9f") .Replace("ż", @"\'bf") .Replace("Ą", @"\'a5") .Replace("Ć", @"\'c6") .Replace("Ę", @"\'ca") .Replace("Ł", @"\'a3") .Replace("Ń", @"\'d1") .Replace("Ó", @"\'d3") .Replace("Ś", @"\'8c") .Replace("Ź", @"\'8f") .Replace("Ż", @"\'af"); }