使用 .NET/C# 创建 RTF 文档时出现法语字符编码问题

Encoding issue with French language characters when creating RTF document using .NET/C#

该应用程序是在 .NET 中开发的,可读取包含占位符的 RTF 文档模板,这些占位符需要替换为当前存储在 SQL 服务器数据库中的文本。然后,该应用程序会使用替换后的文本保存 RTF 文档。但是,从数据库中读取的法语字符,例如 é 在 RTF 文档中显示为 É。

过程是:

  1. 阅读 RTF 文档
  2. 用来自 SQL 服务器 db
  3. 的数据替换占位符
  4. 保存到新的 RTF 文档

我认为代码的关键部分是...

从 RTF 文档中读取:

StringBuilder buffer;
using (StreamReader input = new StreamReader(pathToTemplate))
{
    buffer = new StringBuilder(input.ReadToEnd());
}

用数据库中的文本替换占位符文本:

buffer.Replace("$$placeholder$$", strFrenchCharsFromDb);

将编辑保存为新的 RTF 文档:

byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(buffer.ToString());

File.WriteAllBytes(pathToNewRtfDoc, fileBytes);

当我在“保存”期间调试 buffer 时,出现了 é 字符。 当我在 File.WriteAllBytes 之后打开 RTF 时,它包含 É 而不是。

我尝试在创建 StreamReader 时指定编码,但结果相同。 即 using (StreamReader input = new StreamReader(pathToTemplate, Encoding.UTF8))

在调用 Replace() 之前对 strFrenchCharsFromDb 字符串应用以下方法:

buffer.Replace("$$placeholder$$", ConvertNonAsciiToEscaped(strFrenchCharsFromDb)); 

ConvertNonAsciiToEscaped()方法实现:

/// <param name="rtf">An RTF string that can contain non-ASCII characters and should be converted to correct format before loading to the RichTextBox control.</param>
/// <returns>The source RTF string with converted non ASCII to escaped characters.</returns>

public string ConvertNonAsciiToEscaped(string rtf)
{
    var sb = new StringBuilder();
    foreach (var c in rtf)
    {
        if (c <= 0x7f)
            sb.Append(c);
        else
            sb.Append("\u" + Convert.ToUInt32(c) + "?");
    }
    return sb.ToString();
}