[英]How to convert a string to RTF in C#?
問題
如何將字符串“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 = new RichTextBox();
richTextBox.Text = "Européen";
string rtfFormattedString = richTextBox.Rtf;
但是后來 rtfFormattedString 變成了整個 RTF 格式的文檔,而不僅僅是字符串“Europ\\'e9en”。
堆棧溢出
谷歌
我還在網上找到了一堆其他資源,但沒有什么能完全解決我的問題。
回答
必須添加Trim()
以刪除result
中的前面空格。 除此之外,布拉德克里斯蒂的解決方案似乎有效。
我現在會使用這個解決方案,盡管我有一種不好的直覺,因為我們必須對 RichTextBox 進行 SubString 和 Trim 來獲取 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控制碼代碼分解如下:
\\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) 我不喜歡RichTextBox
在花了幾天時間試圖讓它與在 Word 中創建的 RTF 文檔一起工作之后。
我找到了一個很好的解決方案,它實際上使用 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/
我知道已經有一段時間了,希望這會有所幫助..
在嘗試了我可以使用的每個轉換代碼后,此代碼對我有用:
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);
下面是一個將字符串轉換為 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...");
}
}
這是改進的@Vladislav Zalesak 的回答:
public static string ConvertToRtf(string text)
{
// using default template from wiki
StringBuilder sb = new StringBuilder(@"{\rtf1\ansi\ansicpg1250\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard ");
foreach (char character in text)
{
if (character <= 0x7f)
{
// escaping rtf characters
switch (character)
{
case '\\':
case '{':
case '}':
sb.Append('\\');
break;
case '\r':
sb.Append("\\par");
break;
}
sb.Append(character);
}
// converting special characters
else
{
sb.Append("\\u" + Convert.ToUInt32(character) + "?");
}
}
sb.Append("}");
return sb.ToString();
}
不是最優雅的,但非常優化和快速的方法:
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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.