2

在我的 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.例外。

更新:

解决方案在这里

替代解决方案

更新:

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

4

7 回答 7

3

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

        string zz = "SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=";

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

        // Returns Ihre Bestellung - Versandbestätigung - 1105891246
        string yy = System.Text.Encoding.UTF8.GetString(dd);
于 2012-02-14T14:50:51.527 回答
3

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

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

于 2013-09-02T14:57:59.880 回答
2

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

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

SWhyZSBCZXN0ZWxsdW5nIC0gVmVyc2FuZGJlc3TDpHRpZ3VuZyAtIDExMDU4OTEyNDY=

您将得到以下结果:

Ihre Bestellung - Versandbestätigung - 1105891246

请参阅Base64 在线解码/编码

于 2012-02-14T14:50:32.603 回答
2

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

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

于 2012-02-14T15:41:58.477 回答
1

看起来像一个 base64 字符串。

尝试 Convert.FromBase64String

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

于 2012-02-14T14:50:36.530 回答
1

这是一个编码的 word,当有非 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)都透明地支持编码字。

于 2013-08-29T17:49:21.907 回答
0

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

  • =?从头到尾移除?=_
  • 保持启动到下一个?作为字符集
  • 删除B?- 不知道,它是什么
  • 将其余部分转换为byte[]通过System.Convert.FromBase64String()
  • Encoding.GetSTring()通过使用在第二步中记住的字符集将其转换为最终的字符串
于 2012-02-14T14:54:42.327 回答