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