rtf文件的编码

时间:2015-07-17 09:25:06

标签: c# encoding character-encoding base64 rtf

我得到一个base64编码的字符串,代表一个rtf文件。

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

我现在的问题是我无法将base 64字符串正确解码为其原始表示。我再也没有F¸r了。相反,我有Für甚至F\'fcr。通过这种方式,在观察者中显示解码的rtf时,变音符号的表示是错误的。

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

您可以查看示例文件hereThis是我得到的基本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我收到错误(草图:不支持编码名称,实际项目:数组不为空)。

1 个答案:

答案 0 :(得分:2)

您的问题不是文件的编码。如果您运行代码并比较结果,则每个文本都相同。

您的问题是源文件是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);