【发布时间】:2011-01-25 15:58:49
【问题描述】:
问题
如何将字符串“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”。
堆栈溢出
- Insert string with special characters into RTF
- How to output unicode string to RTF (using C#)
- Output RTF special characters to Unicode
- Convert Special Characters for RTF (iPhone)
谷歌
我还在网上找到了很多其他资源,但没有一个能完全解决我的问题。
回答
必须添加 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());
}
逻辑作为扩展方法:
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;
}
}
【问题讨论】:
-
@Abe Miessler:我看到了这个问题,并在上面的问题中添加了链接。但是,我不太明白这如何解决我的问题(它可能会,但我不明白)。您能否提供一个使上述测试方法通过的代码 sn-p?
-
再次查看我的答案,我已经为您的问题发布了一个(hacky)解决方案。我希望你只是翻译一些次要/更简单的东西。
-
@Lernkurve:看到有人对此投了赞成票,我想我会跟进;这仍然有效吗? (我有点好奇这种方法有多不安全)
-
@BradChristie:我真的无法告诉你这种方法有多不安全。我们没有检查它是否适用于每一种可能的情况。但由于我们不确定,我们为所有我们感兴趣的特殊字符编写了测试,并且对这些特殊字符非常有效。