如何以编程方式将带有特殊字符的字符串插入到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);
答案 0 :(得分:2)
已编辑添加
如上所述,上述答案适用于将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();
}