Quoted-Printableでエンコード・デコード

Quoted-Printableは、MIMEに規定されたエンコード方法の1つです。

携帯電話から送られるHTMLメールでQuoted-Printableが使用されているようなので、 同じように送信できるようVB2005で実装してみました。

Quoted-Printableのエンコード

Quoted-Printableは、「=」以外のASCII文字とスペース、タブ、改行はそのまま使用し その他の値は、8bitごとに「=」と16進数の文字に変換します。(大文字)

※符号化しない範囲:0x21〜0x3C、0x3E〜0x7E

「=」の場合、符号化された文字は、「=3D」となり「=」と16進数の文字列であらわされます。

また、1行が76文字を超える場合、改行と区別するため行末に「=」を追加し行が継続している ことがわかるように編集します。

参考:RFC2045(日本語訳)

Quoted-Printableのエンコードとデコード例

ここでの例は、文字数の制限は考慮していません。

Public Class QuotedPrintable
    Public Function ToQuotedPrintableString(ByVal inArray() As Byte) As String

        Dim strEncodedChar As String = ""
        Dim stbBuff As New StringBuilder
        For i As Integer = 0 To inArray.Length - 1
            If inArray(i) < &H20 Or inArray(i) = &H3D Or inArray(i) > &H7E Then
                strEncodedChar = Hex(inArray(i)).ToUpper
                If strEncodedChar.Length = 1 Then
                    strEncodedChar = "0" & strEncodedChar
                End If
                stbBuff.Append("=" & strEncodedChar)
            Else
                stbBuff.Append(Encoding.ASCII.GetString(inArray, i, 1))
            End If
        Next
        Return stbBuff.ToString
    End Function
    Public Function FromQuotedPrintableString(ByVal s As String) As Byte()
        Dim bytBuff As Byte() = Encoding.ASCII.GetBytes(s)
        Dim strHex As String
        Dim lstBuff As New List(Of Byte)

        For i As Integer = 0 To bytBuff.Length - 1
            If bytBuff(i) = &H3D Then
                strHex = Encoding.ASCII.GetString(bytBuff, i + 1, 2)
                lstBuff.Add(Convert.ToByte(strHex, 16))
            Else
                lstBuff.Add(bytBuff(i))
            End If
        Next
        Return lstBuff.ToArray()
    End Function
End Class