NonSoft

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


 サンプル(ソース/コード)
Quoted-Printableエンコード、Quoted-Printableデコードするサンプル(VB.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デコードすると読めるようになります。

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

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

★フォームモジュール(Form1.vb)
Public Class Form1
    ' QuotedPrintableエンコード
    Private Sub Button1_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 変換前の文字列用
        Dim istr As String = "あいうえお"
        ' 変換後の文字列用
        Dim ostr As String = ""

        For i As Integer = 0 To istr.Length - 1
            If istr.Substring(i, 1) = "=" Then
                ' イコール"="は"=3D"に変換
                ostr = ostr & "=3D"
            ElseIf Asc(istr.Substring(i, 1)) = &H9 Then
                ' タブは変換しない
                ostr = ostr & istr.Substring(i, 1)
            ElseIf Asc(istr.Substring(i, 1)) = &HA Then
                ' 改行は変換しない
                ostr = ostr & istr.Substring(i, 1)
            ElseIf Asc(istr.Substring(i, 1)) = &HD Then
                ' 改行は変換しない
                ostr = ostr & istr.Substring(i, 1)
            ElseIf Asc(istr.Substring(i, 1)) = &H20 Then
                ' スペースは変換しない
                ostr = ostr & istr.Substring(i, 1)
            ElseIf Asc(istr.Substring(i, 1)) >= &H21 And _
                   Asc(istr.Substring(i, 1)) <= &H7E Then
                ' 21(16進)から7E(16進)は変換しない
                ostr = ostr & istr.Substring(i, 1)
            Else
                ' System.Webを参照設定する必要があります
                ' QuotedPrintableはUTF8のUrlEncodeと似ているので代用!!
                Dim tstr As String = istr.Substring(i, 1)
                tstr = System.Web.HttpUtility.UrlEncode(tstr, _
                    System.Text.Encoding.GetEncoding("UTF-8"))

                ' UrlEncodeの変換後文字列のパーセント(%)をイコール(=)に置換
                tstr = tstr.Replace("%", "=").ToUpper
                ostr = ostr & tstr
            End If
        Next

        ' 変換後の文字列を表示
        System.Diagnostics.Trace.WriteLine(ostr)
    End Sub

    ' QuotedPrintableデコード
    Private Sub Button2_Click( _
    ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ' 変換前の文字列用
        Dim istr As String = "=E3=81=82=E3=81=84=E3=81=86=E3=81=88=E3=81=8A"
        ' 変換後の文字列用
        Dim ostr As String = istr

        ' 行末のイコール"="は削除
        ostr = ostr.Replace("=" & vbCrLf, "")
        ostr = ostr.Replace("=" & vbCr, "")
        ostr = ostr.Replace("=" & vbLf, "")

        Dim p0 As Integer = 0
        Dim p1 As Integer = 0
        Do While (p0 <= ostr.Length - 1)
            ' "="を見つけて"%"に変換
            p1 = ostr.IndexOf("=", p0)
            If p1 >= 0 Then
                If p1 + 3 <= ostr.Length Then
                    Try
                        ' "="を見つけて"%"に変換する前に、
                        ' 次の2文字が16進数かどうかチェックする
                        Dim dat As Byte
                        dat = Convert.ToInt32(ostr.Substring(p1 + 1, 2), 16)

                        ' "="を"%"に変換
                        Dim tstr As String = ""
                        tstr = tstr & ostr.Substring(0, p1)
                        tstr = tstr & ostr.Substring(p1, 3).Replace("=", "%")
                        tstr = tstr & ostr.Substring(p1 + 3)
                        ostr = tstr
                    Catch ex As Exception
                    End Try
                End If
                p0 = p1 + 1
            Else
                Exit Do
            End If
        Loop

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

        ' 変換後の文字列を表示
        System.Diagnostics.Trace.WriteLine(ostr)
    End Sub
End Class