我得到一个base64编码的字符串,代表一个rtf文件。
如果我查看原始文本表示(在base64编码之前),我会看到字符序列F¸r
。当在查看器中显示时,这应该代表Für
。 rtf文件的标题包含ansicpg1252
所以这应该是编码,除非另有更改(转义序列,字体定义,..)。
我现在的问题是我无法将base 64字符串正确解码为其原始表示。我再也没有F¸r
了。相反,我有Für
甚至F\'fcr
。通过这种方式,在观察者中显示解码的rtf时,变音符号的表示是错误的。
那么rtf文件的原始编码是什么?或者这里出了什么问题?
您可以查看示例文件here。 This是我得到的基本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
我收到错误(草图:不支持编码名称,实际项目:数组不为空)。
答案 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);