後藤@太陽計測です >>>>> From: Toru Hoshina <toru / gte.net> > 頭から順送りに見て、encodeしないで済むところは読み飛ばし、encodeが > 必要なのが確定した時点で、そこから前後にencode対象となる範囲を伸ばし、 > encoded wordの長さを確定する、という感じでしょうか? > > 0x1Bを見つけた時点で、この先はencodeが必要だ、などと判断するのでしょうが > その前の部分には空白をはさまないで英数字がひっついてるかも知れませんから、 > そのさらに前の空白を見つけるか、文字列の先頭まで戻りながら見るのでしょう。 > そうしないと、本当のencode開始位置が定まりませんよね。 上記はシーケンシャルにポインタを動かして判定していく、といった感じかと 思います。結構大変だと自分では思うので、別の方法をご紹介しておきます。 rfc2047の枠内でアルゴリズムを作るとしたら、こんな1例になるのでは? と、 以前 mew-distで提案したことがあります。そのときの案の概要です。それは 1行(というか1ヘッダ)を丸ごと読み、charsetを考慮したtokenに切り分け、 隣接をmergeしていく方法でした。 * SPは空白(white-space or tab) * AWORDは空白を除くASCII文字の並び * EWORDは上記以外 * APARTはエンコードする必要の無い並び * EPARTはエンコードすべき並び * BOLはfield-bodyの頭、EOLはfield-bodyの末尾 field-bodyを構成するBOL 1*(SP AWORD EWORD) EOLの並びに対して縮小ルール を適用します。 ・(BOL|SP) AWORD 0*(SP AWORD) (SP|EOL) は APARTへ縮小 ・EWORDはEPARTへ縮小 ・隣接する EPART同士は EPARTへ縮小 ・EPART SP EPARTの並びは EPARTへ縮小 ・隣接するEPARTとAWORDは1つのEPARTへ縮小 ・そのた 結果、APART EPARTが交互に現れ、APARTはその両端がBOL,SP,EOLのいずれか が保証されるルールです。(tokenのグループ化操作ということになります) 最後にEPARTを(折り返しと複数charsetを考慮して)エンコードします。 こう考えると、結構いけると思いますが。 (注) 実際のMewでは実際にはこの方法とはちょっと違う方法を使っていますが 大枠はSP ASCII SPに着目しているので似ています。 FLIMは細かく見ていませんが、token分割後にグループ操作する点では 類似です。 具体例として "[ruby-list 1234] Re: 今日はruby で programing" ~~~~~~~~~~ ~~~~~ ~~~ ~~~~~~ ~ ~ ~ ~ ~ ~~~~ ~~ ~~~~~~~~~~ を以下のようにtoken化し、順に縮小します BOL AWORD SP AWORD SP AWORD SP EWORD AWORD SP EWORD SP AWORD EOL ------------v----------------- APART EWORD AWORD SP EWORD SP AWORD EOL -----v----- APART EPART SP EWORD SP AWORD EOL ---------v------- APART EPART SP AWORD EOL -----v------ APART EPART APART 結果、となります。 APART : "[ruby-list 1234] Re: " EPART : "今日はruby で" APART : " programming" field-body折り返しは、それぞれの空白部か、encoded-word途中で 行います。 とまぁ、こんな方法もあります。 文字列のリスト操作なのであんまり難しくないと思います。 > > > などとなります(笑) > > > > というわけで、そうはならないわけです。(^^; > > 御意です。やはり腐っていたのですね(笑) あ〜よかった(なにが?) よかった(^^; #でも、決して「間違いだ」といえないところがネックなんですよね :-( --- Regards, Shun-ichi Goto <gotoh / taiyo.co.jp> R&D Group, TAIYO Corp., Tokyo, JAPAN