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

时间:2012-02-14 14:47:15

标签: c# utf-8 base64 mime email-headers

在我的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ß ???

7 个答案:

答案 0 :(得分:3)

我写了一个可以解码这些字符串的库。您可以在http://github.com/jstedfast/MimeKit

找到它

具体来说,请查看MimeKit.Utils.Rfc2047.DecodeText()

答案 1 :(得分:2)

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

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

SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=

您将获得以下结果:

Ihre Bestellung - Versandbestätigung - 1105891246

请参阅Base64 online decode/encode

答案 2 :(得分:2)

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

        string zz = "SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=";

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

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

答案 3 :(得分:2)

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

This question似乎很好地涵盖了变体。在快速搜索中,我没有找到任何.NET库来自动解码,但如果需要,手动操作并不困难。

答案 4 :(得分:1)

看起来像一个base64字符串。

尝试Convert.FromBase64String

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

答案 5 :(得分:1)

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

http://tools.ietf.org/html/rfc2047#section-2

编码字的BNF是:

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

所以解释这个问题的正确方法是:

  1. 数据是第3和第4个问号之间的内容
  2. 它已被Base64编码('B'代表Base64;如果它是 'Q'然后它将被引用 - 可打印)。
  3. 解码后 数据,它将采用UTF-8字符集。
  4. 正如@Shai正确指出的那样,结果是:

    Ihre Bestellung - Versandbestätigung - 1105891246
    

    这是德国人。变音符号显然是UTF-8的原因,因此需要编码的单词。翻译是:

    Your order - Delivery confirmation - 1105891246
    

    显然,这是订单的跟踪编号。

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

答案 6 :(得分:0)

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

  • 从开始删除=?,从结束
  • 删除?=
  • 将字符集
  • 保持为下一个?
  • 删除B? - 不知道,它是什么
  • 通过byte[]
  • 将其余内容转换为System.Convert.FromBase64String()
  • 使用第二步中记住的字符集,通过Encoding.GetSTring()将其转换为最终字符串