我有一个程序必须解码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中,它看起来像这样:
有谁知道这是什么编码以及如何解码这些字符?
答案 0 :(得分:3)
样品中没有base64。我建议您使用Office格式库(如POI)从Office文档中提取文本/数据。
答案 1 :(得分: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字符。当这些数据通过某些协议通过互联网传输时,数据容易出现乱码(因为协议需要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。