首页 > 解决方案 > 使用 .NET/C# 创建 RTF 文档时法语字符的编码问题

问题描述

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

过程是:

  1. 阅读 RTF 文档
  2. 用 SQL Server db 中的数据替换占位符
  3. 保存到新的 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时,é 字符存在。当我打开 RTF 后File.WriteAllBytes它包含 é 代替。

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

标签: c#character-encodingrtf

解决方案


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

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();
}

推荐阅读