【答客問】信件標題解碼範例
| | | 0 | |
網友提問,希望了解中文編碼解析工具關於信件標題(如=?x-gbk?q?=B5=C4=B7=AD=D2=EB?=)的解碼邏輯,特整理為程式範例並加註說明如下:
using System; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace ConsoleApplication1 { class Program { static void Main(string[] args)
{ string s = "=?big5?B?UmU6IKZVpuyl66bxLKdAt36o06RGLi4u?=";
Console.WriteLine(decodeMailSubject(s));
s = "=?big5?Q?=B6=C2=B7t=B0=F5=A6=E6=BA=FC?="; Console.WriteLine(decodeMailSubject(s));
Console.Read();
}
static string decodeMailSubject(string raw)
{ //若字串結尾是?=會識別失敗,加上一個空白 raw += " "; StringBuilder sb = new StringBuilder(); //先解出一段一段的=?..... ?= foreach (Match m in Regex.Matches(raw,
"=[?](?<enc>.+?)[?](?<type>.+?)[?](?<body>.+?)[?]=[^0-9A-Z]")) { string enc = m.Groups["enc"].Value.ToLower();
string type = m.Groups["type"].Value.ToLower();
string body = m.Groups["body"].Value;
Encoding encoder = null; //識別出Encoding if (enc == "gbk" || enc == "x-gbk")
encoder = Encoding.GetEncoding(936);
else if (enc == "big5")
encoder = Encoding.GetEncoding(950);
else if (enc == "utf-8")
encoder = Encoding.UTF8;
else { return "不支援編碼格式[" + m.Groups["enc"].Value + "]!";
}
if (type == "q")
{ body = body.Replace("=", "%");
body = HttpUtility.UrlDecode(body, encoder);
raw = raw.Replace(m.Value, body);
}
else if (type == "b")
{ byte[] buff = Convert.FromBase64String(body); raw = raw.Replace(m.Value, encoder.GetString(buff));
}
}
return raw; }
}
}
Comments
Be the first to post a comment