NonSoft

Quoted-Printableをエンコード/デコードする
サンプル(C#.NET)


 サンプル(ソース/コード)
Quoted-Printableエンコード、Quoted-Printableデコードするサンプル(C#.NET)です。

Quoted-Printableでエンコードされたメールを解読する時に使います。
Quoted-Printableとは主に電子メールで使用するエンコード方法で、
7ビットの印字可能な文字でデータを転送するために使用されます。

イコール(=)の後に2桁の16進数(HEX)を付けたフォーマットで文字コードを符号化します。
例えば"あいうえお"は"=E3=81=82=E3=81=84=E3=81=86=E3=81=88=E3=81=8A"に変換されます。

"=XX=XX=XX"形式で暗号化されたメールが届いた時には、
Quoted-Printableデコードすると読めるようになります。

VB.NETのサンプルはこちらです。
Quoted-Printableをエンコード/デコードするサンプル(VB.NET)

Quoted-Printable関連のツールはこちらです。
WEBエンコード/デコードツール

★フォームモジュール(Form1.cs)
public partial class Form1 : Form
{
    // QuotedPrintableエンコード
    private void button1_Click(object sender, EventArgs e)
    {
        // 変換前の文字列用
        String istr = "あいうえお";
        // 変換後の文字列用
        String ostr = "";

        for (int i = 0; i <= istr.Length - 1; i++)
        {
            if (istr.Substring(i, 1) == "=")
            {
                // イコール"="は"=3D"に変換
                ostr = ostr + "=3D";
            }
            // Microsoft.VisualBasicを参照設定する必要があります
            else if (Microsoft.VisualBasic.Strings.Asc(istr.Substring(i, 1)) == 0x9)
            {
                // タブは変換しない
                ostr = ostr + istr.Substring(i, 1);
            }
            else if (Microsoft.VisualBasic.Strings.Asc(istr.Substring(i, 1)) == 0xA)
            {
                // 改行は変換しない
                ostr = ostr + istr.Substring(i, 1);
            }
            else if (Microsoft.VisualBasic.Strings.Asc(istr.Substring(i, 1)) == 0xD)
            {
                // 改行は変換しない
                ostr = ostr + istr.Substring(i, 1);
            }
            else if (Microsoft.VisualBasic.Strings.Asc(istr.Substring(i, 1)) == 0x20)
            {
                // スペースは変換しない
                ostr = ostr + istr.Substring(i, 1);
            }
            else if (Microsoft.VisualBasic.Strings.Asc(istr.Substring(i, 1)) >= 0x21 &&
                Microsoft.VisualBasic.Strings.Asc(istr.Substring(i, 1)) <= 0x7E)
            {
                // 21(16進)から7E(16進)は変換しない
                ostr = ostr + istr.Substring(i, 1);
            }
            else
            {
                // System.Webを参照設定する必要があります
                // QuotedPrintableはUTF8のUrlEncodeと似ているので代用!!
                String tstr = istr.Substring(i, 1);
                tstr = System.Web.HttpUtility.UrlEncode(tstr,
                    System.Text.Encoding.GetEncoding("UTF-8"));

                // UrlEncodeの変換後文字列のパーセント(%)をイコール(=)に置換
                tstr = tstr.Replace("%", "=").ToUpper();
                ostr = ostr + tstr;
            }
        }

        // 変換後の文字列を表示
        System.Diagnostics.Trace.WriteLine(ostr);
    }

    // QuotedPrintableデコード
    private void button2_Click(object sender, EventArgs e)
    {
        // 変換前の文字列用
        String istr = "=E3=81=82=E3=81=84=E3=81=86=E3=81=88=E3=81=8A";
        // 変換後の文字列用
        String ostr = istr;

        // 行末のイコール"="は削除
        ostr = ostr.Replace("=" + "\r\n", "");
        ostr = ostr.Replace("=" + "\r", "");
        ostr = ostr.Replace("=" + "\n", "");

        int p0 = 0;
        int p1 = 0;
        while (p0 <= ostr.Length - 1)
        {
            // "="を見つけて"%"に変換
            p1 = ostr.IndexOf("=", p0);
            if (p1 >= 0)
            {
                if (p1 + 3 <= ostr.Length)
                {
                    try
                    {
                        // "="を見つけて"%"に変換する前に、
                        // 次の2文字が16進数かどうかチェックする
                        int dat;
                        dat = Convert.ToInt32(ostr.Substring(p1 + 1, 2), 16);

                        // "="を"%"に変換
                        String tstr = "";
                        tstr = tstr + ostr.Substring(0, p1);
                        tstr = tstr + ostr.Substring(p1, 3).Replace("=", "%");
                        tstr = tstr + ostr.Substring(p1 + 3);
                        ostr = tstr;
                    }
                    catch{}
                }
                p0 = p1 + 1;
            }
            else
            {
                break;
            }
        }

        // System.Webを参照設定する必要があります
        // QuotedPrintableはUTF8のUrlDecodeと似ているので代用!!
        ostr = System.Web.HttpUtility.UrlDecode(ostr,
            System.Text.Encoding.GetEncoding("UTF-8"));

        // 変換後の文字列を表示
        System.Diagnostics.Trace.WriteLine(ostr);
    }
}