将带有特殊字符的字符串插入RTF

时间:2010-01-20 10:52:26

标签: asp.net encoding rtf

如何以编程方式将带有特殊字符的字符串插入到RTF中? 我有rtf模板我加载到字符串,然后用数据替换所有$MY_VARIABLE$。 数据包含像'ąęść'这样的特殊字符,问题是在结果文件中这些字符被替换为'?'。编码有问题,但是什么?

我的代码如下:

StreamReader reader = new StreamReader("template.rtf");
StringBuilder form = new StringBuilder(reader.ReadToEnd());
// here I replace variables in rtf with data
Encoding srcEncoding = new UTF8Encoding();
Encoding dstEncoding = new ASCIIEncoding();
byte[] utf = srcEncoding.GetBytes(form.ToString());
byte[] asci = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, utf);
return dstEncoding.GetString(asci);

2 个答案:

答案 0 :(得分:2)

请检查the answerthis question


已编辑添加

如上所述,上述答案适用于将RTF转换为PlainText,根据RTF Specification 1.6,您使用\u261a来显示ą\u281e用于{{1} }} ...

语法为 \ u Nd ,其中 N 是字符的十进制Unicode值,< strong> d 是ASCII近似值。


编辑为Clarify

对于你说的,你在RTF中有一些占位符,对吗?

您需要做的是拥有一个功能,在替换占位符时,添加正确的RTF编码字符。

经过一些研究,我认为你可能会使用这样的东西:

ę

答案 1 :(得分:2)

我使用了Paulo Santos回复的代码示例,但是:
  - 在C#中   - 改进编码字符'{','}','\'和'\ n'   - 没有复杂的RemoveDiacritics()部分,因为对我来说太复杂了,我的羞耻解决方案(只是把'?'作为ascii近似)适合我的需要(在DevExpress的RichEditControl中rtf) 它肯定是错误的,但它适用于'€'或'因'。

public static string GetRtfEncoding(char c)
{
    if (c == '\\') return "\\\\";
    if (c == '{') return "\\{";
    if (c == '}') return "\\}";
    if (c == '\n') return "\r\n\\line ";
    int intCode = Convert.ToInt32(c);
    if (char.IsLetter(c) && intCode < 0x80)
    {
        return c.ToString();
    }
    return "\\u" + intCode + "?";   
}
public static string GetRtfString(string s)
{
    StringBuilder returned = new StringBuilder();
    foreach(char c in s)
    {
        returned.Append(GetRtfEncoding(c));
    }
    return returned.ToString();
}