保科です。

On Fri, Nov 13, 1998 at 04:16:39PM +0900,
Shun-ichi GOTO <gotoh / taiyo.co.jp> wrote:

> 後藤@太陽計測です
> 
> >>>>> From: Sinichiro Dezawa <dezawa / miya.fujifilm.co.jp>
> > だめだ、作り直しだ。
> > 名前を rfc2047.rb にする、ってんで一応読んで見たら、
> > 1行76Byteではなくて、1行中のエンコード文字列長(合計)が76Byte
> > だった。(いいのかな、それで)
> 
> え?
> 前者でいいと思うのですが、どこかそうでない記述がありました?
> 前者を表すのは以下の記述なのですが。。
> エンコードした結果、encoded-wordを含む1行の長さが76文字を超えないように、
> という制約だけだと思いますが。実際にはmultiple header lineのための
> 行頭の1文字の空白があるので、=?...?.?....?=の最大長は75charsだと。

ちょっと、うまく切れないので引用が長くなってしまいましたが、
Sinichiro Dezawa さんがおっしゃることと、後藤@太陽計測さんの
おっしゃることって大意は同じですよね?

Dezawaさんは、B encode 前の文字列を76bytes毎に切ってencodeする
のではなく、encoded-word、つまり=?から?=までを76bytesにします、
というのを、いいのかな?それで、と疑問に思っておられると読めます。

> > 2. Syntax of encoded-words
>   ...
> >   While there is no limit to the length of a multiple-line header
> >   field, each line of a header field that contains one or more
> >   'encoded-word's is limited to 76 characters.

後藤@太陽計測さんは、multiple header lineのための行頭の空白、えっと
Non Linear White Spaceでしたっけ?を計算に入れて、75charsという
解釈のようですが、細かいことですが、私はやはり読んだとおりで、
encoded-wordの長さは76charsまで、つまり=?から?=までで76bytesだと
思います。

> エンコード後の長さが妥当になるような、元文の区切り点を見つける処理が面
> 倒だとは思いますが。

実際には =?iso-2022-jp?B?...?= という形のencoded wordになるわけですが
iso-2022-jpだよ、と言う以上、それらしくESC$Bではじまって、ESC(Bなどで
us-asciiなりJIS1バイト英数字なりに戻してやるのがお約束なのだろうとは
思います。

=?iso-2022-jp?B?...?= abc =?iso-2022-jp?B?...?=

などという形式になるってことは、エスケープシーケンスはencoded wordの中です。
これって、フザケんなよ凸(-_-#)って感じですよねぇ。

iso-2022-jpというと、code set も encode method もJIS X 0208(でしたっけ?)
をそのまま使いますが、2バイト文字集合だけで、1バイトカナは含まず、という
ものだったと思うので、実際には、1バイトの英数字は含まないですよね。

思うにUnix系のユーザさんは英数字は1バイトの文字を使うかたがほとんどな
ように見えるので、放っておいてもそこでencoded wordは切れることになるので
実際にはencoded wordの76bytesな縛りってのは効いてこないような気もします。

base64って3bytesが4bytesになる勘定ですから、え〜〜っと、
76 から =?iso-2022-jp?B? と ?= の分だけ引いて、58。4で割って14と2余り(笑)
14かける3で42。エスケープシーケンスの分6bytesを引くと、36。2で割って18。

半角カナの全角化をしないですむような素直なEUCの文字列とすると、18文字で
切って8bit目を立て、前後をESC hogeではさみ、B encodeして余りの2バイトは
paddingということになるでしょうか。はぁ大変…

-- 
Toru Hoshina
Network Associates,Inc.
Pacific Rim, Software Engineer.
http://www.best.com/~hoshina
PGP fingerprint : 95 73 1C 26 C6 9E 28 86  BA 32 34 CA FC 9B DC 6D