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

網友提問,希望了解中文編碼解析工具關於信件標題(如=?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;
        }
    }
}
歡迎推文分享:
Published 11 April 2013 09:23 PM 由 Jeffrey
Filed under: ,
Views: 4,189



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<April 2013>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication