【问题标题】:Decode Base 64 and encode as Utf-8 still leaves encoded characters [closed]解码 Base 64 并编码为 Utf-8 仍然留下编码字符 [关闭]
【发布时间】:2014-07-31 23:07:49
【问题描述】:

我有一个程序必须解码 base 64 字符串,然后将其再次解码为 UTF-8。该程序从 .doc 中提取文本,然后从 Dropbox 本地下载(使用 Temboo)。文档前后还是有奇怪的字符。这是页面的一部分在 Microsoft Word 2011 for Mac 中的样子:

我试图将文本放入在线文本解码器中,但似乎无法找到上述文本块的编码方式。这就是我目前解码文本的方式:

encoded = encoded.replaceAll("\r\n", "");
encoded = encoded.replaceAll("\n", "");
encoded = encoded.replaceAll("\r", "");

// decoding the response
decoded = StringUtils.newStringUtf8(Base64.decodeBase64(encoded));

在 TextEdit.app 中看起来像这样:

有谁知道这是什么编码以及如何解码这些字符?

【问题讨论】:

  • 好像是二进制头。这可以是 Microsoft Word 文档吗?
  • 是的,它是一个 .doc 文件
  • “解码 base 64 并编码为 UTF-8”没有意义。 Base 64 用于编码任意二进制数据,不能将任意二进制数据编码为 UTF-8。
  • 这个问题似乎离题了,因为它是关于做一些没有意义的事情。
  • 我的解释可能没有意义,但我提供的图片和男女同校确实有道理。所以请推翻你的反对票,因为你为什么反对没有意义@HotLicks

标签: java temboo


【解决方案1】:

您的示例中没有 base64。我建议您使用 Office 格式库(如 POI)从 Office 文档中提取文本/数据。

【讨论】:

  • 我正在解码的字符串是base64。我通过 api 调用获取文件的内容,并以 base64 格式提供给我。所以我正在尝试解码该字符串并使用 stringAsUtf8 对其进行解码。然后我使用 FileOutputStream 编写一个 .doc 文件。但我仍然得到那些随机的欧米茄字符
  • 嗯,我不明白 base64、DOC 和 UTF8 是如何相关的(通常它们不是)。所以我怀疑那是你的问题。如果这是一个 base64 解码的 MS Word 文档,则将字节 1:1 写入而不转换为 UTF8。然后你需要在一个可以实际读取 doc 文件的程序(不是文本编辑器)中打开它。
  • 将 Base64 解码为二进制 (byte[]) 并将 that 写入文件。用 Word 打开。
【解决方案2】:

这是 Word .docx 文件的第一部分,以十六进制表示:

50 4b 03 04 14 00 06 00 08 00 00 00 21 00 e1 0f
8e bf 8d 01 00 00 29 06 00 00 13 00 08 02 5b 43
6f 6e 74 65 6e 74 5f 54 79 70 65 73 5d 2e 78 6d
6c 20 a2 04 02 28 a0 00 02 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

请注意,上面的每个 2 位值都是 一个 字符。前两个值——50 和 4b——是 ASCII 字符 P 和 K。(谷歌“ASCII 表”你会明白我的意思。)

这是你能看到的所有字符数据:

PK[Content_Types].xml

如果您查看十六进制值,任何大于 0x7F 的值都不是有效的 ASCII/UTF8 字符。当此类数据通过某些协议在 Internet 上传输时,数据很容易出现乱码(因为协议需要 ASCII 字符),除非它以某种方式编码为 ASCII。这就是“Base-64”的目的。

Base-64 将上述数据编码为:

UEsDBBQABgAIAAAAIQDhD46/jQEAACkGAAATAAgCW0NvbnRlbn
RfVHlwZXNdLnhtbCCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

这可以安全传输,因为所有值都是常规 ASCII 字符(它们的数值低于 0x7f)。

当您解码 Base-64 时,您可能会得到与开始时相同的数据,因此如果您将该数据写入文件,您将“重构”原始 .docx 文件。

另一方面,如果您将解码后的数据(或从未编码的数据)输入字节到字符串转换器(例如newStringUtf8),则大于 0x7f 的字符将被解释为 UTF8 序列并转换为相应的UTF16 或 UTF32 字符。但是“二进制”数据(例如 .doc 或 .docx 文件中的标题数据)只是数字——它不是字符数据。将这些二进制值转换为 UTF 字符不会产生任何意义。此外,某些值无法在转换后保留下来,也不会正确转换回来。

处理此文件的方法是将 .doc 文件从 Base-64 格式“重构”为“二进制”,将该数据写入“二进制”文件。然后使用了解如何阅读其标题并明智地将其拆开的软件。这可能是 Word 本身,也可能是一些专门为访问 Word 文件内部而编写的 API。

【讨论】:

  • 感谢您的回答。写出字节 [] 而不是尝试 utf 8 方式。再次感谢并抱歉之前...我们都知道编程有时会令人沮丧
  • @heinst - 学习如何提出正确的问题很重要。
  • 我以为我解释清楚了,或者我认为很清楚。对不起
  • @heinst - 你的问题有几个问题。例如,您提供的第一个数据没有得到充分解释。我仍然无法判断它是否应该是 Base-64 数据、您的 UTF8 数据或其他数据。您根据自己的(错误的)假设跳来跳去,而不是按逻辑顺序排列情况以便其他人可以理解。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 2017-06-17
相关资源
最近更新 更多