【问题标题】:Encoding of rtf filertf文件的编码
【发布时间】:2015-07-17 18:04:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能添加你用来编码和解码内容的代码吗?
  • 我从 Web 服务获取内容,但无法获取编码代码。我被告知应该使用iso-8859-1 进行编码。至少我可以访问原始文件。我用我所拥有的更新我的问题。

标签: c# encoding character-encoding base64 rtf


【解决方案1】:

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

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

【讨论】:

  • 看来你是对的。对于文件输出,它正在工作。本来我想把它导入NSData。如果我用NSData.FromArray(isoBytes) 这样做,我会得到完全错误的结果。所以我必须转换它?但是为了什么?如果我选择另一种编码,我会再次遇到问题。源编码是“Windows-1252”?我认为这在我的环境中不受支持(Mac 上的 Xamarin.iOS)。
  • 你想在NSData 中用它做什么?目标是什么?您可以转换为 UTF8 放入其中,然后在需要时转换回来。
  • 我使用NSData 临时存储数据,然后我在UIWebView 中表示数据。我想我需要知道它之前是哪种编码,并且我必须记住它。什么是源编码? Windows-1252, ISO-8859-1?
  • 大概有一个不匹配,因为documentData 现在是 UTF8。文档中似乎没有任何内容说它必须是 UTF8 - 它只是一个缓冲区。你能不只使用NSData.FromArray(isoBytes)而不转换吗?
  • 似乎字符串转换将采用 UTF8,所以为了正确恢复它,我认为你会做类似iso.GetString(documentData.ToArray()) 的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 2018-11-12
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多