*RFC 2045 の BNF 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) "=" ; Maximum length of 76 characters 最大長76文字 qp-section := [*(ptext / SPACE / TAB) ptext] ptext := hex-octet / safe-char safe-char := ; Characters not listed as "mail-safe" in ; RFC 2049 are also not recommended. ;; RFC 2049 の 「mail-safe」 (メイル安全)に無い文字は ;; 使用しないのが良い。 hex-octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F") ; Octet must be used for characters > 127, =, ; SPACEs or TABs at the ends of lines, and is ; recommended for any character not listed in ; RFC 2049 as "mail-safe". ;; 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. ;; 構成者は生成しちゃ'''ダメ'''。受信者は扱えないと'''ダメ'''。 *説明 (RFC 2045, 2047 より抜粋・補足) CTE で使われるのが Quoted-Printable, それに似た encoded-word で使われてる のが Q 符号化。 1. text/* で CRLF やってる CR (0x0D), LF (0x0A) 以外のオクテットは 「"=" 2HEXDIGIT」で表せる。 A 〜 F は大文字のみ、小文字は禁止。 ところがどっこい、 RFC 2047 では大文字にするべき (小文字 should)。 なんだ、小文字でもいい(こともある)んだ? 2. 0x21 〜 0x3C, 0x3E 〜 0x7E は生で出現可能。但し場面に左右される。 (cf. 0x3D "=") -メイル本体では全部 OK。 -でも EBCDIC 関門考えると、 !"#$@[\]^`{|}~ も 1 で符号化した方が。 -[[非構造化領域]]の encoded-word では、 =?_ は 1 で符号化。 -comment 中の encoded-word では、更に ()\ も駄目。 (ここ、RFC 2047 では誤植があって、 " も止めた方がいいかも。) -word の置き換えたる encoded-word は、 A-Za-z0-9!*+-/= ''しかだめ''。 3. SP, TAB は生で出現 OK。但し符号化行の最後にあたる部分 (CRLF の手前) では生では現れたら駄目。その時は 1 に従い =20 とかする。 encoded-word の Q 符号化では駄目。 =20, =09 を使うべし。 4. text/* で CRLF はそのまま。そうでない 0x0A, 0x0D は 1 に従い =0A とかする。 encoded-word の Q 符号化では当然駄目。 =0D とか =0A 使うべし。 5. (軟改行 soft line-break) = で終わる (あるいは = のあとに SP, TAB だけが幾つか続いて終わる) (終わるというか、その次が改行 CRLF になる) 時は、その改行は元データの改行ではない。 (から、 復号した時に = 以降まとめてなくなる。) encoded-word の Q 符号化では当然駄目。 6. 符号化した人は行末に SP, TAB を入れちゃいけないけど、 中継者が入れるかもしれないから、復号する人は必ず無視しないといけない。 encoded-word の Q 符号化では関係なし。 7. Q 符号化では、 0x20 を 「_」(0x5F)で表現できる。 (もちろん、本来の 0x5F は =5F になる。) Quoted-Printable では駄目。「_」は単に 0x5F。 *エラー処理 RFC 2045 にはエラー処理の話が。 1. = の後2文字は 0-9A-F で大文字 only だけど、 慈悲深い人 (原文は robust でごーいんな人:-) は小文字も解釈してあげたら。 (でもこれは解釈するべきだと思う。前節の 1 参照。) 2. = の後に来るはず無い文字が来たら、そのまま処理 (=xy をそのまま 0x5C 0x78 0x79 と解釈) して、利用者にイかれてたよって教えてあげたら良さげ。 3. いっちばん最後かその手前に = が来た時も 2 とおんなじ。 4. 0x09 (TAB), CRLF, 0x20 〜 0x7E 以外のオクテットが来たら、 ごーいんな人はそいつを取り除いちゃって、利用者にイかれてたよって 教えてあげたら良さげ。 5. 76オクテットを超えてても、ふつーに処理して、利用者に以下略。 *See also -[[符号化]] --[[転送符号化]] ---[[Base64]] -[[MIME]] --[[Encoded-Word]] --[[Content-Transfer-Encoding:領域]] - [1] [[JISX4346]]:1999 = [[ISO/IEC13522-6]]:1998 の B.3.4 で規定されている QPRINTABLE は、 RFC 1521 の Quoted‐Printable の変種で、(1) 16進数に小文字を使っても構わない (2) 改行は [CODE(ABNF)[CRLF]] ではなく [CODE(ABNF)[1*(CR / LF / [[FF]])]] とし、一行の文字数も規制しないという修正を加えたものです。 - [2] [WEAK[2004-02-06 00:36:31 +00:00]] ''[[aiueo]]'': aiueo