使用 .NET/C# 创建 RTF 文档时出现法语字符编码问题
Encoding issue with French language characters when creating RTF document using .NET/C#
该应用程序是在 .NET 中开发的,可读取包含占位符的 RTF 文档模板,这些占位符需要替换为当前存储在 SQL 服务器数据库中的文本。然后,该应用程序会使用替换后的文本保存 RTF 文档。但是,从数据库中读取的法语字符,例如 é 在 RTF 文档中显示为 É。
过程是:
- 阅读 RTF 文档
- 用来自 SQL 服务器 db
的数据替换占位符
- 保存到新的 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();
}
该应用程序是在 .NET 中开发的,可读取包含占位符的 RTF 文档模板,这些占位符需要替换为当前存储在 SQL 服务器数据库中的文本。然后,该应用程序会使用替换后的文本保存 RTF 文档。但是,从数据库中读取的法语字符,例如 é 在 RTF 文档中显示为 É。
过程是:
- 阅读 RTF 文档
- 用来自 SQL 服务器 db 的数据替换占位符
- 保存到新的 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();
}