rtf文件的编码

Encoding of rtf file

我得到一个代表 rtf-file.

的 base64 编码字符串

如果我查看原始文本表示(在 base64 编码之前),我会看到字符序列 F¸r。当在查看器中显示时,这应该代表 Für。 rtf-file 的 header 包含 ansicpg1252 因此这应该是编码,除非另有更改(转义序列,字体定义,..)。

我现在的问题是我无法将 base 64 字符串正确解码为其原始表示形式。我再也没有得到 F¸r 了。相反,我有 Für 甚至 F\'fcr。因此,在查看器中显示解码后的 rtf 时,变音符号的表示是错误的。

那么rtf-file的原始编码是什么?或者这里出了什么问题?

你可以查看示例文件 here. This 是我得到的 base 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 指令告诉任何正在解释 RTF 的是它是 ANSI 编码的(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);