c# - 使用 .NET/C# 创建 RTF 文档时法语字符的编码问题
问题描述
该应用程序是在 .NET 中开发的,它读取一个 RTF 文档模板,其中包含需要替换为当前存储在 SQL Server 数据库中的文本的占位符。然后,应用程序会使用替换的文本保存 RTF 文档。但是,从数据库读取的法语字符(例如 é)在 RTF 文档中显示为 é。
过程是:
- 阅读 RTF 文档
- 用 SQL Server 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
时,é 字符存在。当我打开 RTF 后File.WriteAllBytes
它包含 é 代替。
我尝试在创建 StreamReader 时指定编码,但结果相同。IEusing (StreamReader input = new StreamReader(pathToTemplate, Encoding.UTF8))
解决方案
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();
}
推荐阅读
- multithreading - 需要为数千个结果解析数千个文件 - 更喜欢 powershell
- node.js - 如何让 Angular 监视多个库的更改并在需要时重新编译
- python - 无法从我的 docker 容器连接到远程数据库实例,但是可以从我的主机连接
- c# - 我可以在 Nlua 中使用静态类吗?
- android - adb.exe: unknown command am adb.exe: unknown command sleep error 当我试图在我的 root android 设备上运行 shell 脚本时不断弹出
- delphi - 从初始 FormResize 绘制时,TCanvas 上的垂直绘制文本不可见
- prolog - 在 prolog 中构建专家系统的问题
- google-apps-script - 同一单元格的 Google Apps 脚本 setValue() 和 setBackgroundRGB()
- c# - 如何在 c# 中运行多行 Powershell 脚本?
- macos - Hammerspoon 键重复