解码 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 字符串的主要内容,如果未能解决你的问题,请参考以下文章
编码问题:在 Python 中解码 Quoted-Printable 字符串
VC++详解Base64编解码原理以及Base64编解码接口实现(附源码)