Quoted-printable(QPエンコーディングとも呼ばれる)は、主に
インターネット電子メールで使用される
符号化方式の一つです。この方式は、印字可能な
ASCII文字(
英数字や記号)を用いて、8ビットのデータを7ビットのデータパスで安全に転送するために設計されました。
Quoted-printableの概要
インターネット電子メールの基本的なプロトコルであるSMTPは、もともと
ASCII文字のみをサポートしていました。しかし、MIME(
Multipurpose Internet Mail Extensions)の導入により、
電子メールで
ASCII以外の情報を送信することが可能になりました。この際、
ASCII以外の文字を扱うために、様々な
文字符号化方式が用いられます。ただし、これらの
符号化方式は
ASCIIの範囲外の値を頻繁に使用するため、
電子メールでの使用にはさらなる工夫が必要です。
Quoted-printableは、任意のバイト値を一連の
ASCII文字に変換することで、この問題を解決します。この
符号化方式は可逆変換であり、符号化されたデータは元のバイト値、つまり非
ASCII文字に正確に復元できます。
Quoted-printableと
Base64は、MIMEで定義された2つの主要なContent-Transfer-Encodingです。入力文字列に
ASCII文字が多く含まれる場合、Quoted-printableは可読性を保ちつつデータサイズを小さく抑えることができます。しかし、
ASCII以外の文字が多い場合は、可読性が損なわれ、データサイズも大きくなる傾向があります。一方、
Base64は可読性はありませんが、データサイズが一定であるため、バイナリデータや非ラテン文字を使用する言語のテキストには適しています。
一部のメールクライアントでは、Quoted-printable文字列の復号時に、行末にドットがあると誤動作する場合がありますので注意が必要です。
Quoted-printableの符号化ルール
Quoted-printableでは、任意の8ビットバイト値を3文字の
ASCII文字で表現します。具体的には、「=」の後に、そのバイト値を16進数で表した2桁の文字を続けます。例えば、改ページ文字(10進数で12)は「=0C」、等号(10進数で61)は「=3D」と符号化されます。
印字可能な
ASCII文字(10進数で33から126)は、原則としてそのまま使用できます。ただし、等号(=、10進数で61)は例外で、必ず「=3D」と符号化する必要があります。また、タブ文字(10進数で9)とスペース文字(10進数で32)も、基本的にはそのまま使用できますが、行末に現れる場合は「=09」(タブ)と「=20」(スペース)に符号化する必要があります。
テキストデータにおける改行コードは、システムによって異なります(例えば、WindowsではCRLF、UnixではLFなど)。Quoted-printableでは、テキストデータであることを前提とする場合、これらの改行コードを、システムに依存せず
ASCIIの「CRLF」に統一して扱うことになっています。復号時には、各システムがそれぞれの改行コードに変換する必要があります。
もし符号化前のCRやLFを復号後も維持したい場合は、それぞれ「=0D」(CR)、「=0A」(LF)として符号化する必要があります。
Quoted-printableで符号化されたデータの行は、76文字を超えてはなりません。この制限を満たすために、必要に応じてソフト改行が挿入されます。ソフト改行は、行末に「=」を置くことで示され、復号時には無視されます。
まとめ
Quoted-printableは、
ASCII文字が主体となるテキストデータを効率的にエンコードするのに適した方式です。しかし、非
ASCII文字が多い場合は、
Base64などの他のエンコード方式を検討する方が良いでしょう。また、メールクライアントによっては、Quoted-printableの解釈に問題が生じる場合があるため、注意が必要です。
参照
- - RFC 1521 (obsolete)
- - RFC 2045 (MIME)