Quantcast
Channel: 黑暗執行緒
Viewing all articles
Browse latest Browse all 2447

【答客問】信件標題解碼範例

$
0
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
    {
staticvoid 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();
        }
 
staticstring 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);
elseif (enc == "big5")
                    encoder = Encoding.GetEncoding(950);
elseif (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);
                }
elseif (type == "b")
                {
byte[] buff = Convert.FromBase64String(body);
                    raw = raw.Replace(m.Value, encoder.GetString(buff));
                }
            }
return raw;
        }
    }
}

Viewing all articles
Browse latest Browse all 2447

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>