Quoted-printable
Quoted-printable(QP encodingとも呼ばれる)は、印字可能な文字(例えば、英数字や等号「=
」)を使用した符号化方式であり、8ビットデータを7ビットデータパスで転送するためのものである。インターネット電子メールで使用できるようにするため、Content-Transfer-Encoding として定義されている。
概要
[編集]基本的なインターネット電子メール転送プロトコルであるSMTPでは、ASCII文字のみがサポートされている(英: 8-bit clean)。MIMEでは、電子メールでASCII文字以外の情報を送信するためのメカニズムを定義している。これには、文字列中に英語で使われない文字が含まれる場合に、ASCII以外の文字符号化方式を使用して扱うことが含まれる。しかしながら、これらの文字符号化方式ではASCII範囲外の値が頻繁に使用されるので、電子メールで適切に使用できるようにするためには、さらに符号化する必要がある。Quoted-printable符号化方式は、任意のバイト値を一連のASCII文字に変換するための方式である。この符号化方式は可逆変換であり、符号化されたバイト値が表す元のバイト値、つまり非ASCII文字に復元することができる。
Quoted-printableとBase64は、2つの基本的な MIME Content-Transfer-Encoding である。入力文字列のほとんどがASCII文字である場合は、Quoted-printableで符号化した結果をほとんどそのまま読むことができ、データサイズも小さくなる。一方、入力文字列のほとんどがASCIIではない場合は、Quoted-printableを使用してもそのまま読むことはできず、サイズ効率も非常に悪い。Base64はそのまま読める方式ではないが、どのようなデータに対してでもサイズ効率は一定である。それで、バイナリー形式データやラテン文字ではない言語に対しては、Base64を選択するのが道理にかなっている。
電子メールクライアントによっては、Quoted-printable文字列を復号するときに、行末にドットがあると誤動作する場合がある。
Quoted-printableの符号化
[編集]任意の8 ビットバイト値は、3文字に符号化してよい。これは、「=
」の後ろにそのバイトの数値を表す2桁の16進数文字(0
から9
またはA
からF
)を付けたものである。例えば、US-ASCIIの改ページ(NP
)文字(10進数で12)は「=0C
」と表される。また、US-ASCIIの等号(10進数で61)は「=3D
」になる。印字可能なASCII文字以外のすべての文字、および改行文字はこのようにして符号化しなければならない。
すべての印字可能なASCII文字(10進数で33から126)はそのまま変換なしに表してよい。ただし、「=
」(10進数で61)だけは例外である。
ASCIIのタブ文字(10進数で9)およびスペース文字(10進数で32)はそのまま変換なしに表してよいが、行末に現れた場合だけは例外である。これらの文字が行末に現れた場合は「=09
」(タブ)および「=20
」(スペース)に符号化されることになる。
テキスト中で行の終わりを意味するバイト列は、MS-DOS や Microsoft Windows では「CRLF」、UNIX や Linux では「LF」、第9版までの古い MacOS や Microware OS-9 では「CR」であるなど、システムによって異なるが、それらはまとめて「改行」と呼ばれる。符号化処理中のテキストの改行は Quoted-Printable 符号では、それがテキストデータであることを前提とする場合には、システムの違いに無関係に ASCIIの「CRLF」の並び対応させる決まりである。 Quoted-Printable 符号の「CRLF」をテキストに戻す場合には、システムがそれぞれの改行を意味するバイト列に復号しなければならない。
符号化前(古いMacOS など) | Quoted-printable 符号 | 復号後(UNIX など) |
---|---|---|
Sell in MayCRand go away.CR
|
Sell in MayCRLFand go away.CRLF
|
Sell in MayLFand go away.LF
|
符号化処理するデータの中の「CR」を複合後も「CR」にさせたり、符号化処理するデータの中の「LF」を複合後も「LF」にさせたい場合には、 Quoted-Printable 符号化時には、それぞれ、「CR」は「=0D
」に、「LF」は「=0A
」に符号化しなければならない。
Quoted-printable で符号化したデータの行は、76文字を超えてはならない。符号化した文字列を変換せずにこの要件を満たすため、必要に応じてソフト改行 が追加される。ソフト改行は符号化後の行末に「=
」が置かれたものであり、復号した文字列には改行は現れない。