解码 Base64 / Quoted Printable 编码的 UTF8 字符串

Posted

技术标签:

【中文标题】解码 Base64 / Quoted Printable 编码的 UTF8 字符串【英文标题】:Decoding Base64 / Quoted Printable encoded UTF8 string 【发布时间】:2012-03-05 22:33:13 【问题描述】:

在我的 ASP.Net 应用程序工作过程中,我需要对字符串做一些工作,这相当于

=?utf-8?B?SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=?=

如何将其解码为正常的人类语言?

提前致谢!

更新:

Convert.FromBase64String() 不适用于字符串,等于 =?UTF-8?Q?Bestellbest=C3=A4tigung?=

我得到The format of s is invalid. s contains a non-base-64 character, more than two padding characters, or a non-white space-character among the padding characters. 异常。

更新:

Solution Here

Alternative solution

更新:

那是什么字符串编码:Nweiß???

【问题讨论】:

对我来说看起来像 base64。尝试使用 base64 解码,看看是否能得到你的 utf-8 字符串。 Nweiß是一个html实体,可以用HttpUtility.HtmlDecode HttpUtility.HtmlEncode解码/编码。 【参考方案1】:

实际上是一个base-64字符串:

        string zz = "SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=";

        byte[] dd = Convert.FromBase64String(zz);

        // Returns Ihre Bestellung - Versandbestätigung - 1105891246
        string yy = System.Text.Encoding.UTF8.GetString(dd);

【讨论】:

【参考方案2】:

我编写了一个库来解码这些类型的字符串。你可以在http://github.com/jstedfast/MimeKit找到它

具体看MimeKit.Utils.Rfc2047.DecodeText()

【讨论】:

【参考方案3】:

这似乎是 MIME 标头编码。第二个示例中的 Q 表示它是 Quoted Printable。

This question 似乎很好地涵盖了这些变体。在快速搜索中,我没有找到任何可以自动解码的 .NET 库,但如果需要,手动进行应该不难。

【讨论】:

【参考方案4】:

那不是 UTF8。那是一个 Base64 编码的字符串。

UTF-8 仅表示目标字符串为 UTF8 格式。 解码Base64字符串后:

SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=

你会得到以下结果:

Ihre Bestellung - Versandbestätigung - 1105891246

见Base64 online decode/encode

【讨论】:

它不适用于 =?UTF-8?Q?Bestellbest=C3=A4tigung?= 请参阅主题更新。 当然不行,=?UTF-8?Q?Bestellbest=C3=A4tigung?= 不是 base64 编码的字符串。 看来,我的任务变得更复杂了.. 请您解释一下,那是什么字符串?我应该从中得到“Bestellbestätigung”.. 你从哪里得到输入? 似乎是 MIME 标头编码。 B 是 Base 64,Q 是引用可打印的【参考方案5】:

看起来像一个 base64 字符串。

试试 Convert.FromBase64String

http://msdn.microsoft.com/en-us/library/system.convert.frombase64string.aspx

【讨论】:

【参考方案6】:

这是一个编码字,当有非 ASCII 内容时,在电子邮件标头中使用它。编码词在 RFC 2047 中定义:

https://www.rfc-editor.org/rfc/rfc2047#section-2

编码词的 BNF 是:

encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

所以正确的解释方式是:

    数据是第三个和第四个问号之间的东西 它已经过 Base64 编码(“B”代表 Base64;如果它是 'Q' 那么它将被引用-打印)。 解码后 数据,它将采用 UTF-8 字符集。

正如@Shai 正确指出的那样,结果是:

Ihre Bestellung - Versandbestätigung - 1105891246

这是德语。变音符号显然是 UTF-8 的原因,因此需要编码字。译文是:

Your order - Delivery confirmation - 1105891246

显然这是订单的跟踪号。

所有现代电子邮件客户端(和 Outlook)都透明地支持编码字。

【讨论】:

【参考方案7】:

这有点猜测,但让我们试试

从开头删除=?,从结尾删除?= 保持启动到下一个?作为字符集 删除B? - 不知道是什么 通过System.Convert.FromBase64String() 将其余部分转换为byte[] 使用第二步中记住的字符集通过Encoding.GetSTring()将其转换为最终字符串

【讨论】:

以上是关于解码 Base64 / Quoted Printable 编码的 UTF8 字符串的主要内容,如果未能解决你的问题,请参考以下文章

base64编码与base64解码

编码问题:在 Python 中解码 Quoted-Printable 字符串

VC++详解Base64编解码原理以及Base64编解码接口实现(附源码)

C#:用于解码 Quoted-Printable 编码的类?

关于Base64解码的问题:

编码问题:解码Python中的Quoted-Printable字符串