rtf文件的编码
本文关键字:编码 文件 rtf | 更新日期: 2023-09-27 18:03:16
我得到一个base64编码的字符串,它代表一个rtf文件。
如果我查看原始文本表示(在base64编码之前),我看到字符序列F¸r
。在查看器中显示时,它应该代表Für
。rtf文件的头包含ansicpg1252
,所以这应该是编码,除非另有更改(转义序列,字体定义,…)。
我现在的问题是,我不能正确解码基本64字符串到其原始表示。我再也得不到F¸r
了。相反,我有Für
甚至F''fcr
。通过这种方式,在查看器中显示解码后的rtf时,变音符的表示是错误的。
那么rtf文件的原始编码是什么?或者这里出了什么问题?
您可以在这里查看示例文件。这是我得到的64进制编码字符串。
编辑:我没有编码的代码,但我想我可以重建它。这是我的代码:
string path = "/some/path/ltxt1 Kopie.rtf";
byte[] document = File.ReadAllBytes(path);
string base64string = Convert.ToBase64String(document);
var isoBytes = Convert.FromBase64String(base64string);
File.WriteAllText ("/some/path/sketch.rtf", System.Text.Encoding.GetEncoding("iso-8859-1").GetString(isoBytes));
我试图改变编码,但与windows-1252
我得到一个错误(草图:编码名称不支持,实际项目:数组不为空)。
您的问题不是文件的编码。如果您运行代码并比较结果,则每个结果中的文本都是相同的。
你的问题是源文件是ANSI编码,你的第二个文件是UTF-8编码。然而,文本中的RTF指令告诉任何解释它是ANSI编码的RTF (ansicpg1252
部分)。因此,由于不匹配,它会把解码弄得一团糟。
最简单的方法是确保使用匹配的编码将其写回磁盘:
var iso = Encoding.GetEncoding("ISO-8859-1");
File.WriteAllText("/some/path/sketch.rtf", iso.GetString(isoBytes), iso);
或者更简单:
File.WriteAllBytes("/some/path/sketch.rtf", isoBytes);