【问题标题】:Decoding Base64 / Quoted Printable encoded UTF8 string解码 Base64 / Quoted Printable 编码的 UTF8 字符串
【发布时间】: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解码/编码。

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


【解决方案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 "?="
          

          所以正确的解释方式是:

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

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

          Ihre Bestellung - Versandbestätigung - 1105891246
          

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

          Your order - Delivery confirmation - 1105891246
          

          显然这是订单的跟踪号。

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 2017-10-05
              • 2014-03-01
              • 1970-01-01
              • 2018-02-01
              • 2011-01-14
              • 2019-04-29
              • 2010-11-08
              • 2018-07-09
              • 1970-01-01
              相关资源
              最近更新 更多