2011年9月8日木曜日

Quated-PrintableデコードのC#ソース。How to decode BASE64 and Quated-Printable with C#.

ネット見てもQuated-Printableデコードのサンプルが
あまりなかったのでVisual C#サンプルソースをここに大公開!!
How to decode base64 and quated-printable string.

2013/3/28
そういえば、twitterで文字化け現象が起きてるそうな。
なんか最近やたらとこのページのアクセスが多かったのは、
やっぱりBASE64関係だったのか。
こういう意味でもコードの使用は自己責任でお願いします。

public static String DecodeMailString(String str)
{
        try
        {
            if (str == null || str == "") return "";

            // ?で区切り
            // separate with "?"
            String[] s = str.Split('?');
            byte[] b;
            String ret;

            if (s.Length < 3)
            { 
                // quatedなら少なくとも?は3つ
               // this judge its normal string, if they dont hae ? at least 3.
                return str;
            }

            if (s[2] == "B")
            {
                //Base64 encoding
                b = System.Convert.FromBase64String(s[3]);
                // s[1] specifies eincoding
                string dec = System.Text.Encoding.GetEncoding(s[1]).GetString(b);
                //if(s[4] != "=")
                //{
                //    ret += s[4];
                //}
                // =?x2022-JP?B?の処理
                ret = System.Text.RegularExpressions.Regex.Replace(str, @"""?=[?][^?]*[?][^?]*[?][^?]*[?]=""?", dec);
            }
            else if (s[2] == "Q")
            {
                // Quoted-printable
                // http://homepage1.nifty.com/glass/tom_neko/web/web_03.html#Q_encode

                // sample:
                // "=?utf-8?Q?=E8=8F=8A=E5=9C=B0_=E5=BA=83=E8=A1=8C?=" 
                string target = s[3]; // =E8=8F=8A=E5=9C=B0_=E5=BA=83=E8=A1=8C
                List b16 = new List();
                Encoding enc;
                try
                {
                    enc = Encoding.GetEncoding(s[1]);
                }
                catch (Exception ex)
                {
                    enc = Encoding.GetEncoding("UTF-8");
                }
                for (int i = 0; i < target.Length; i++)
                {
                    if (target[i] == '=')
                    {
                        if (target.Length >= i + 2)
                        {
                            string hexStr = new string(target.ToCharArray(i + 1, 2));
                            b16.Add(System.Convert.ToByte(hexStr, 16));
                            i += 2; 
                        }
                        else
                        {
                            break;
                        }
                    }
                    else if (target[i] == '_')
                    {
                        b16.AddRange(enc.GetBytes(" "));
                    }
                    else
                    {
                    }
                }
                string dec = enc.GetString(b16.ToArray());

                ret = System.Text.RegularExpressions.Regex.Replace(str, @"""?=[?][^?]*[?][^?]*[?][^?]*[?]=""?", dec);

                LogRotation.Log.WriteLine(LogRotation.Level.Information, "DecodeMailString", "Quoted-printable from: " + target + " , to:" + dec );
            }
            else
            {
                //throw new Exception("decode error : " + str);
                return str;
            }
            return ret;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

0 件のコメント:

コメントを投稿