<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><section><h1>RFC 2045 の BNF</h1><pre>     quoted-printable := qp-line *(CRLF qp-line)
     qp-line := *(qp-segment transport-padding CRLF)
                qp-part transport-padding
     qp-part := qp-section
                ; Maximum length of 76 characters 最大長76文字
     qp-segment := qp-section *(SPACE / TAB) &quot;=&quot;
                   ; Maximum length of 76 characters 最大長76文字
     qp-section := [*(ptext / SPACE / TAB) ptext]
     ptext := hex-octet / safe-char
     safe-char := &lt;any octet with decimal value of 33 through
                  60 inclusive, and 62 through 126&gt;
                  ; Characters not listed as &quot;mail-safe&quot; in
                  ; RFC 2049 are also not recommended.
                  ;; RFC 2049 の 「mail-safe」 (メイル安全)に無い文字は
                  ;; 使用しないのが良い。
     hex-octet := &quot;=&quot; 2(DIGIT / &quot;A&quot; / &quot;B&quot; / &quot;C&quot; / &quot;D&quot; / &quot;E&quot; / &quot;F&quot;)
                  ; Octet must be used for characters &gt; 127, =,
                  ; SPACEs or TABs at the ends of lines, and is
                  ; recommended for any character not listed in
                  ; RFC 2049 as &quot;mail-safe&quot;.
                  ;; 127以上、 = 、行末の SP・TAB  はダメ。
                  ;; RFC 2049 の(以下同文)。
                  ;; 書いてないけど大文字・小文字を区別する。
     transport-padding := *LWSP-char
                          ; Composers MUST NOT generate
                          ; non-zero length transport
                          ; padding, but receivers MUST
                          ; be able to handle padding
                          ; added by message transports.
                  ;; 構成者は生成しちゃ<strong>ダメ</strong>。受信者は扱えないと<strong>ダメ</strong>。</pre></section><section><h1>説明 (RFC 2045, 2047 より抜粋・補足)</h1><p>CTE で使われるのが Quoted-Printable, それに似た encoded-word で使われてる
のが Q 符号化。</p><p>1. text/* で CRLF やってる CR (0x0D), LF (0x0A) 以外のオクテットは
「&quot;=&quot; 2HEXDIGIT」で表せる。 A 〜 F は大文字のみ、小文字は禁止。
ところがどっこい、 RFC 2047 では大文字にするべき (小文字 should)。
なんだ、小文字でもいい(こともある)んだ?</p><p>2. 0x21 〜 0x3C, 0x3E 〜 0x7E は生で出現可能。但し場面に左右される。
(cf. 0x3D &quot;=&quot;)</p><ul><li>メイル本体では全部 OK。</li><li>でも EBCDIC 関門考えると、 !&quot;#$@[\]^`{|}~ も 1 で符号化した方が。</li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非構造化領域</anchor>の encoded-word では、 =?_ は 1 で符号化。</li><li>comment 中の encoded-word では、更に ()\ も駄目。 (ここ、RFC 2047 では誤植があって、 &quot; も止めた方がいいかも。)</li><li>word の置き換えたる encoded-word は、 A-Za-z0-9!*+-/= <em>しかだめ</em>。</li></ul><p>3. SP, TAB は生で出現 OK。但し符号化行の最後にあたる部分 (CRLF の手前)
では生では現れたら駄目。その時は 1 に従い =20 とかする。
encoded-word の Q 符号化では駄目。 =20, =09 を使うべし。</p><p>4. text/* で CRLF はそのまま。そうでない 0x0A, 0x0D は 1 
に従い =0A とかする。 encoded-word の Q 符号化では当然駄目。 =0D 
とか =0A 使うべし。</p><p>5. (軟改行 soft line-break) = で終わる (あるいは = のあとに SP, TAB
だけが幾つか続いて終わる) (終わるというか、その次が改行 CRLF になる)
時は、その改行は元データの改行ではない。 (から、
復号した時に = 以降まとめてなくなる。) encoded-word 
の Q 符号化では当然駄目。 </p><p>6. 符号化した人は行末に SP, TAB を入れちゃいけないけど、
中継者が入れるかもしれないから、復号する人は必ず無視しないといけない。
encoded-word の Q 符号化では関係なし。</p><p>7. Q 符号化では、 0x20 を 「_」(0x5F)で表現できる。 (もちろん、本来の
0x5F は =5F になる。) Quoted-Printable では駄目。「_」は単に 0x5F。</p></section><section><h1>エラー処理</h1><p>RFC 2045 にはエラー処理の話が。</p><p>1. = の後2文字は 0-9A-F で大文字 only だけど、
慈悲深い人 (原文は robust でごーいんな人:-) は小文字も解釈してあげたら。
(でもこれは解釈するべきだと思う。前節の 1 参照。)</p><p>2. = の後に来るはず無い文字が来たら、そのまま処理 (=xy をそのまま 0x5C
0x78 0x79 と解釈) して、利用者にイかれてたよって教えてあげたら良さげ。</p><p>3. いっちばん最後かその手前に = が来た時も 2 とおんなじ。</p><p>4. 0x09 (TAB), CRLF, 0x20 〜 0x7E 以外のオクテットが来たら、
ごーいんな人はそいつを取り除いちゃって、利用者にイかれてたよって
教えてあげたら良さげ。</p><p>5. 76オクテットを超えてても、ふつーに処理して、利用者に以下略。</p></section><section><h1>変種</h1><section><h1>QPRINTABLE</h1><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISX4346</anchor>:1999 = <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC13522-6</anchor>:1998 の B.3.4 で規定されている QPRINTABLE は、 RFC 1521 の Quoted‐Printable の変種で、(1) 16進数に小文字を使っても構わない (2) 改行は <code class="ABNF">CRLF</code> ではなく <code class="ABNF">1*(CR / LF / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FF</anchor>)</code> とし、一行の文字数も規制しないという修正を加えたものです。</li></ul></section><section><h1>DKIM-Quoted-Printable</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 4871</anchor> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor> という Quoted Printable
の変種を定義しています。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> の Quoted Printable との違いは、
(1) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>が意味を持つ場合は符号化しなければならず、 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor> された文字列中には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>
(<code class="ABNF" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FWS</anchor></code>) を自由に挿入でき、
無視されること、 (2) やわらかい改行 (行末の <code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">=</anchor></code> 
により<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">改行</anchor>が無視されるというもの) を使えないこと、 (3) 
行長制限を持たないことです。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>に適用することが想定されている
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> の Quoted Printable に対して、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor>
は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル要素</anchor>で利用することが想定されているため、
このような違いがあるものと考えられます。なお、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor> でも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十六進数</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">大文字</anchor>でなければなりません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor> 自体は、 <code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">;</anchor></code> 
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タグ</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">分離</anchor>に使われます。) と
<code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">=</anchor></code> (符号化オクテットの1文字目に使われます。)
と <code class="charname" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SPACE</anchor></code> を除くすべての <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">印字可能文字</anchor>をそのまま用いることを認めています。
(なお、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ABNF</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">注釈</anchor>において、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 2049</anchor>
<code class="ABNF" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mail-safe</anchor></code> でない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>は符号化することが推奨
(小文字 recommend) されています。)
しかし、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor> を使う場所によっては、
そのまま用いられる文字を更に制限していることがあります。
<code class="822" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Signature</anchor>:</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">頭欄</anchor>の
<code class="822"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">z</anchor>=</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タグ</anchor>では、 <code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">|</anchor></code>
も符号化しなければなりません。</p></section><section><h1>qp-section</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 4871</anchor> における <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鍵</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文章表現</anchor> (3.6.1. 節) における
<code xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">n</anchor>=</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タグ</anchor>の値は <code class="ABNF" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">qp-section</anchor></code> 
として定義されています。
<code class="ABNF" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">qp-section</anchor></code> は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> Quoted Printable
の1行にあたります。同じ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 4871</anchor> で定義されている
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DKIM-Quoted-Printable</anchor> とは異なり、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>は無視されず、
その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>自体として解釈されることになります。
<code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">;</anchor></code> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タグ</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">分離</anchor>するために使われるので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>としての <code class="char"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">;</anchor></code> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タグ</anchor>の値で使う場合、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>する必要があります (なぜか 3.5. で説明されています)。</p></section></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エスケープ</anchor>文字こそ違いますが、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">パーセント符号化</anchor>と同種の方式といえます。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Base16</anchor> とも遠い親戚といえます。</p></section><section><h1>歴史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <cite xml:lang="en">RFC 6376 - DomainKeys Identified Mail (DKIM) Signatures</cite>
(<time>2011-10-09 12:08:31 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc6376">http://tools.ietf.org/html/rfc6376</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <cite>Article delegate/1443 (95Apr23) Re: Netscape 1.1b3 mail</cite>
( (<time>1995-04-23 07:08:46 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://news.delegate.org/mail-lists/delegate/1443">http://news.delegate.org/mail-lists/delegate/1443</anchor-external></p></section></body></html>