以前做过,有点忘记了!
好你是=? 秋?=中间的是有用的信息,
而用前几位也只是不是具体的内容,
是用来判断编码格试的,
=?gb2312?B?这几位去掉,再把 ?=这个去掉,
=? 和?= 有点像xml中的< />这个意思,而gb2312?B?存是为了确定编码格试,
好你是=? 秋?=中间的是有用的信息,
而用前几位也只是不是具体的内容,
是用来判断编码格试的,
=?gb2312?B?这几位去掉,再把 ?=这个去掉,
=? 和?= 有点像xml中的< />这个意思,而gb2312?B?存是为了确定编码格试,
解决方案 »
- 求大神 类型System.String的对象无法转换成类型System.Object[]。。
- 连接SQL2000问题
- <a onclick='Show(this)'>匹配</a>怎么同时触发服务器端事件
- 100分请教:在winform中treeview增加删除xml节点的问题
- 在.cs文件里不能有Response,Server等,怎么解决?
- DataGrid各列之间的数据关系?
- C# 将数据库中已经转化为二进制文件的word文件显示在窗体上
- DLLIMPORT引用C++写的DLL
- 代码太长我想分两段写,怎么换行?
- 讨论!请大家都关心关心这个问题,尤其是微软工程师和编程高手们?
- 郁闷 散分!!!!
- 请问使用OleDbCommandBuilder为什么不能给数据适配器自动生成SQL语句?
我做了一个POP3收邮件的类,自己觉得还挺好用的,可以联系联系,QQ 25738191。下面是我的解码部分的代码,专门用来在POP3中解码,收发人姓名、主题、正文、附件名等等都能正确解码,QP编码也没问题;没有编码的也能自动判断;它会用解码后的文字替换掉未解码的部分。
根据情况调用其中的公有方法就OK,做过POP3的应该很容易明白的。举个例子吧,比如楼主得到的这个 subject,就可以这样
string subject = "=?gb2312?B?zMYg0viyqA==?=";
subject = MailDecoder.GetString(subject);
之后 subject 中的结果是 "唐 银波"。再如content是正文,content-transfer-encode是正文传输编码,charset是正文的字符集(做过POP3的很好理解),就可以这样:
content = MailDecoder.GetString(content, content-transfer-encode, charset);/// <summary>
/// 提供对邮件信息进行解码静态方法。
/// </summary>
internal class MailDecoder
{ /// <summary>
/// 解析解码正则式。
/// </summary>
private static System.Text.RegularExpressions.Regex AnalysisRegex =
new System.Text.RegularExpressions.Regex(
@"\=\?(?<charset>[^\?]+)\?(?<transfer_encode>[^\?]+)\?(?<content>[^\?]+)\?\=",
System.Text.RegularExpressions.RegexOptions.Compiled); /// <summary>
/// 对指定字符串进行解码。
/// </summary>
/// <param name="codes">待解码的字符串</param>
/// <returns>解码后的字符串</returns>
public static string GetString(string codes)
{
System.Text.RegularExpressions.Match m = AnalysisRegex.Match(codes);
if (m.Success)
codes = codes.Replace(m.Value,
this.GetString(m.Groups["content"].Value,
m.Groups["transfer_encode"].Value,
m.Groups["charset"].Value));
return codes;
} /// <summary>
/// 以指定的传输编码对字符串进行解码。
/// </summary>
/// <param name="codes">待解码的字符串</param>
/// <param name="transferEncode">指定传输编码</param>
/// <returns>解码后的字符串</returns>
/// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
public static string GetString(string codes, string transferEncode)
{
return this.GetString(codes, transferEncode, System.Text.Encoding.Default);
} /// <summary>
/// 以指定的传输编码对字符串进行解码。
/// </summary>
/// <param name="codes">待解码的字符串</param>
/// <param name="transferEncode">指定传输编码</param>
/// <param name="charset">指定解码后字符的字符集</param>
/// <returns>解码后的字符串</returns>
/// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
public static string GetString(string codes, string transferEncode, string charset)
{
if (charset == null)
return this.GetString(codes, transferEncode, System.Text.Encoding.Default);
return this.GetString(codes, transferEncode, System.Text.Encoding.GetEncoding(charset));
} /// <summary>
/// 以指定的传输编码对字符串进行解码。
/// </summary>
/// <param name="codes">待解码的字符串</param>
/// <param name="transferEncode">指定传输编码</param>
/// <param name="contentEncoding">指定解码后字符的编码方式</param>
/// <returns>解码后的字符串</returns>
/// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
private static string GetString(string codes, string transferEncode, System.Text.Encoding contentEncoding)
{
return contentEncoding.GetString(this.GetBytes(codes, transferEncode));
} /// <summary>
/// 以指定的传输编码对字符串进行解码。
/// </summary>
/// <param name="codes">待解码的字符串</param>
/// <param name="transferEncode">指定传输编码</param>
/// <returns>解码后的字节数组</returns>
/// <res>若指定的传输编码未知,则引发 MailException 异常。</res>
public static byte[] GetBytes(string codes, string transferEncode)
{
switch(transferEncode.ToLower())
{
case "base64" :
case "b" :
return DecodeBase64(codes);
case "quoted-printable" :
case "q" :
return DecodeQuotedPrintable(codes);
default :
throw new MailException("未知编码方式:" + transferEncode);
}
} /// <summary>
/// 对 Base64 编码进行解码。
/// </summary>
/// <param name="codes">待解码的 Base64 字符串</param>
/// <returns>解码后的字节数组</returns>
private static byte[] DecodeBase64(string codes)
{
return Convert.FromBase64String(codes);
} /// <summary>
/// 对 Quoted-Printable 编码进行解码。
/// </summary>
/// <param name="codes">待解码的 Quoted-Printable 字符串</param>
/// <returns>解码后的字节数组</returns>
private static byte[] DecodeQuotedPrintable(string codes)
{
System.Collections.ArrayList byteArray = new System.Collections.ArrayList(); int i = 0;
while (i < codes.Length)
{
// 编码部分,解码输出
if (codes[i] == '=')
{
// 跳过换行
if (codes[++i] == '\n')
{
i++;
continue;
}
// 转换输出
else
{
byte b = Convert.ToByte(codes.Substring(i, 2), 16);
byteArray.Add(b);
i += 2;
}
}
// 未编码部分,直接输出
else
{
byteArray.Add(codes[i++]);
}
} return (byte[]) byteArray.ToArray(typeof(byte));
}}