|
|||||
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); } } |