https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2018-01-12T01:35:59Z
Ruby Issue Tracking System
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=69555
2018-01-12T01:35:59Z
mame (Yusuke Endoh)
mame@ruby-lang.org
<ul></ul><p>遠藤と申します。ご報告ありがとうございます。</p>
<p>Quoted-Printable を規定しているのは RFC 2045 の "6.7. Quoted-Printable Content-Transfer-Encoding" だと思います。関連しそうなところを中心にルールを要約すると</p>
<p>(1) canonical form での CRLF 改行の CR と LF 以外の文字は、原則として =0C のようにエンコードする。ただし他のルールが別表現を許している場合はそれ以外でもよい。<br>
(2) イコール以外の printable な文字(32〜60、62〜126)はそのままエンコード結果に出してもよい。<br>
(3) 空白文字(9 と 32)もそのまま出してもよい。ただし行末に置く場合は =20 みたいにしないとダメ。<br>
(4) テキスト内の CRLF 改行は、出力でも CRLF にしないといけない。メディア形式によっては CRLF 改行表現がないこともあるので、そういう形式ではハード改行を含めてはダメ。非テキストのエンコードでは =0D や =0A や =0D=0A が普通に現れる。<br>
(5) 一行は 76 文字まで。行末に = をつけること。</p>
<p>と書いてあるように読めました(規格の誤読に定評と実績があるので、他の人にも確認してほしいです)。<br>
この解釈が正しければ、現在の挙動である "...=0D\n..." は明確に否定されていると思います。</p>
<blockquote>
<p>今からpack('M')の挙動を変えると、影響範囲が大きそうなので、バイナリをQuoted-Printableでエンコード<br>
するためのオプションがあれば、いいと思うのですが、packにどういうオプション名をつければよいか、</p>
</blockquote>
<p>互換性は大切ですが、規格違反だとしたら(少なくともいつかは)直すべきであると思います。<br>
また、テキストか非テキストかでエンコード結果を変えることは、規格によって事実上要求されているように読めました。</p>
<p>思いつきですが、できればオプションを増やしたくはないので、エンコード対象の文字列の文字コードが ASCII-8BIT かそれ以外かで切り替えるのはどうでしょうか。> 成瀬さん</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=69556
2018-01-12T04:24:05Z
usa (Usaku NAKAMURA)
usa@garbagecollect.jp
<ul></ul><p>遠藤さんのRFCの解釈内容に同意します。</p>
<p>直さなければいけないのも同意しますが、互換性はやっぱり大切、というか、<br>
テキストかバイナリかは本来必ず指定されなければいけない(判断のしようがない)と<br>
思いますので、やはりここはオプションを追加して、</p>
<p><code>M</code> : 従来挙動。ただし将来削除するものとして警告を出す<br>
<code>M0</code>: RFC2045テキスト準拠<br>
<code>M1</code>: RFC2045バイナリ準拠</p>
<p>というのを提案します。<br>
<code>0</code> と <code>1</code> は安直にbinmode指定フラグとみなして言ってますが、ちょっと<br>
暗号的に過ぎるのかなあ、という懸念はあります。<br>
(もっとも、packテンプレート自体が元々暗号的ですが)</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=69557
2018-01-12T04:49:31Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>うささんの案には惹かれるものがありますが、 M を削除するよりは将来の挙動を変更すると警告するほうが良いと思います。で、デフォルトでどちらかによせるかというとバイナリかな?</p>
<p>Matz.</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=69559
2018-01-12T17:48:02Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>まず報告の\rと\nが逆なように思います。</p>
<p>で、検討にあたって互換性というかまず現状を考えたいのです。<br>
そもそも quoted-printable は改行がCRLFであるべきところ、pack("M")の出力はLFだけを通すんですよね。</p>
<p>という挙動だけ見るとこれはバイナリモードなのかと最初考えますが、<br>
LFのままではネットワークに流せませんからこの出力をメールなどで出す場合は s/\n/\r\n/g すればよい……<br>
とみせかけてそうすると今度は物理改行がLFだった情報が無くなるので、そもそもLFもエンコードして<br>
すべてソフト改行にしないと元の情報が残りません。<br>
これは現状のpack("M")でやるより自分でgsubした方が早いですし、そもそもBASE64使った方がいいですね。</p>
<p>現状は基本的にはテキストモードであって、後処理の便宜のためにLFになっているだけであり、<br>
ヘッダとつなげるなりした後 s/\n/\r\n/g すればよいのだと仮定すれば、そこそこ使えるものだと考えられます。</p>
<p>すると、この場合 =0D\n が出力結果に含まれるのは明らかに意図せぬものとなります。<br>
というようなことを考えると、入力のCRLF(や単独のCR)は誰かがLFに正規化するべきなのでしょう。</p>
<p>べき論としては出力をCRLFに変えるべきなのかもしれませんが、<br>
トラップとしては大きすぎるので自分で気付くだろうからまぁそのままでいいかな。</p>
<p>RFC2045バイナリ準拠だとCR、LF、CRLF全てエンコードになると思うのですが、それって必要なのですかね。<br>
それが必要な場合すでにgsubを使って独自実装しているような気がします。</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=69561
2018-01-13T01:54:33Z
kirika (Toshio Maki)
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/69561/diff?detail_id=47952">diff</a>)</li></ul><p>2018/01/13 10:53追記 \rと\nの表記が逆になっていたため訂正しました。</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=69562
2018-01-13T04:11:25Z
kirika (Toshio Maki)
<ul></ul><p>皆様ご意見いただきありがとうございます。</p>
<p>成瀬さんのおっしゃる通り、私の手元では現状はpack("M")の出力にgsubを付加して、呼び出し側で回避するコードを入れています。</p>
<p>また、Mailライブラリ側でも同種の議論があり、バイナリの場合はto_crlfで改変しないようにするのか、<br>
pack("M")呼び出し時に、後処理をするのかなど、試行錯誤していますが、まだ落ち着いていない状況です。</p>
<p><a href="https://github.com/mikel/mail/issues/1010" class="external">https://github.com/mikel/mail/issues/1010</a><br>
<a href="https://github.com/mikel/mail/pull/1113" class="external">https://github.com/mikel/mail/pull/1113</a></p>
<p>Ruby側でバイナリモード時のQuoted-Printableがサポートされれば、それを呼び出すのが一番いいのではないかと思っているのですが、<br>
pack("M")の出力に加工を加える、でも対応はできると思うので、ここでの方針が決まれば、mailライブラリのコミュニティにも報告しようかと思っています。</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=71545
2018-04-19T07:28:48Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>Applied in changeset trunk|r63191.</p>
<hr>
<p>pack/unpack M only handles LF line breaks [Feature <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Array#pack("M") Quoted-Printable with binary mode (Closed)" href="https://bugs.ruby-lang.org/issues/14352">#14352</a>]</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=71557
2018-04-19T07:54:21Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>議論したのですが、結論としてドキュメントイシューということになりました。</p>
<p>大本のPerlもそうですが、pack/unpackは前提として、Unix環境で入力をとり、LFのまま出力し、<br>
その出力をsendmail等に流して、それらがLFをCRLFに変換することを想定したものであろうという見解に至りました。<br>
よって、現状の挙動はその用途においては妥当なものなので、変更せず、ドキュメントの追記のみを行いました。</p>
<p>kirika (Toshio Maki) wrote:</p>
<blockquote>
<p>また、Mailライブラリ側でも同種の議論があり、バイナリの場合はto_crlfで改変しないようにするのか、<br>
pack("M")呼び出し時に、後処理をするのかなど、試行錯誤していますが、まだ落ち着いていない状況です。</p>
<p><a href="https://github.com/mikel/mail/issues/1010" class="external">https://github.com/mikel/mail/issues/1010</a><br>
<a href="https://github.com/mikel/mail/pull/1113" class="external">https://github.com/mikel/mail/pull/1113</a></p>
<p>Ruby側でバイナリモード時のQuoted-Printableがサポートされれば、それを呼び出すのが一番いいのではないかと思っているのですが、<br>
pack("M")の出力に加工を加える、でも対応はできると思うので、ここでの方針が決まれば、mailライブラリのコミュニティにも報告しようかと思っています。</p>
</blockquote>
<p>バイナリモード時の Quoted-Printable はハード改行をどう扱うかが一般にはよくわからないので、<br>
汎用ツールであるRubyでは扱わないことになりました。<br>
ad-hocな対応はmailライブラリの側で対応をお願いします。</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=71580
2018-04-20T02:12:57Z
kirika (Toshio Maki)
<ul></ul><p>なるせさん</p>
<p>ご検討いただきありがとうございました。<br>
mailライブラリとしてはこの結果をベースに修正案を出してみようと思います。</p>
Ruby master - Feature #14352: Array#pack("M") Quoted-Printable with binary mode
https://bugs.ruby-lang.org/issues/14352?journal_id=71899
2018-05-08T01:57:51Z
shyouhei (Shyouhei Urabe)
shyouhei@ruby-lang.org
<ul><li><strong>Related to</strong> <i><a class="issue tracker-1 status-5 priority-4 priority-default closed" href="/issues/14741">Bug #14741</a>: [].pack('M') quoted printable RFC2045 contains only LF, does not contain CRLF, Messages</i> added</li></ul>