/[suikacvs]/messaging/manakai/doc/introduction.ja.html
Suika

Diff of /messaging/manakai/doc/introduction.ja.html

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by wakaba, Mon Apr 1 09:21:23 2002 UTC revision 1.8 by wakaba, Sun Aug 17 03:37:53 2003 UTC
# Line 1  Line 1 
1  <?xml version="1.0" encoding="iso-2022-jp"?>  <?xml version="1.0" encoding="iso-2022-jp"?>
2  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"  <?xml-stylesheet href="/s/simpledoc.css" type="text/css" ?>
3     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
4  <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
5  <head>  <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml">
6  <title xml:lang="en">Message::* Perl modules</title>  <head>
7  <link rel="index" href="./" />  <title>manakai ($B5l>N(B Message::* Perl modules)</title>
8  <?xml-stylesheet href="/s/simpledoc"?>  <link rel="index" href="./" />
9  <link rel="stylesheet" href="/s/simpledoc" />  <link rel="stylesheet" href="/s/simpledoc.css" type="text/css" />
10  <link rev="made" href="mailto:w@suika.fam.cx" />  <link rev="made" href="mailto:w@suika.fam.cx" />
11  <link rel="copyright" href="/c/pd" title="Public Domain." />  <link rel="copyright" href="/c/pd" title="Public Domain." />
12  <meta name="author" content="若葉" />  <meta name="author" content="$B<cMU(B" />
13  <meta name="keywords" content="Perl, module, pm, Message, RFC 822, RFC 2822, RFC 1036, son-of-RFC 1036, MIME, Usefor, HTTP, CGI, header, field" />  <meta name="keywords" content="Perl, module, pm, Message, RFC 822, RFC 2822, RFC 1036, son-of-RFC1036, MIME, Usefor, HTTP, CGI, header, field" />
14  </head>  </head>
15  <body>  <body>
16  <h1>Message::* Perl modules</h1>  <h1>manakai ($B5l>N(B Message::* Perl modules)</h1>
17    
18  <h2>はじめのはじめに</h2>  <p>$BCm0U(B: $B$3$NJ8=q$NFbMF$K$O8E$$;vJA$,4^$^$l$F$$$^$9!#(B
19    $B:G?7$N>pJs$O(B
20  <p>たとえば Perl で書かれた CGI script, それも掲示板なんかには、  <a href="/~wakaba/-temp/wiki/wiki?manakai">SuikaWiki:manakai</a>
21  こんなくだらない code が載っていたりします。</p>  $B$r$4Mw$/$@$5$$!#(B</p>
22    
23  <pre class="application-x-perl">  <h2>$B$O$8$a$N$O$8$a$K(B</h2>
24  jcode'convert(*from, "jis");  
25  jcode'convert(*subject, "jis");  <p>$B$?$H$($P(B Perl $B$G=q$+$l$?(B CGI script, $B$=$l$b7G<(HD$J$s$+$K$O!"(B
26  jcode'convert(*message, "jis");  $B$3$s$J$_$C$H$b$J$$(B code $B$,:\$C$F$$$?$j$7$^$9!#(B</p>
27  open (MAIL, "| $sendmail");  
28  print MAIL "From: $mail ($from)\n";  <pre class="example"><code class="perl">jcode'convert(*from, "jis");
29  print MAIL "To: $mailto\n";  jcode'convert(*subject, "jis");
30  print MAIL "Subject: $subject\n";  jcode'convert(*message, "jis");
31  print MAIL "\n";  open (MAIL, "| $sendmail");
32  print MAIL "$message";  print MAIL "From: $mail ($from)\n";
33  print MAIL "\n";  print MAIL "To: $mailto\n";
34  close (MAIL);  print MAIL "Subject: $subject\n";
35  </pre>  print MAIL "\n";
36    print MAIL "$message";
37  <p>これでは視認性も良くないですし、うっかり修正し間違えると  print MAIL "\n";
38  変なメッセージを送信してしまいます。  close (MAIL);
39  (筆者はしょっちゅうはまってました:-)  </code></pre>
40  (それに多くの code では、  
41  HTML でのクロスサイトスクリプティング (CSS) 問題と  <p>$B$3$l$G$O;kG'@-$bNI$/$J$$$G$9$7!"$&$C$+$j=$@5$74V0c$($k$H(B
42  類似の問題への対処をしていません。)</p>  $BJQ$J%a%C%;!<%8$rAw?.$7$F$7$^$$$^$9!#(B
43    ($BI.<T$O$7$g$C$A$e$&$O$^$C$F$^$7$?(B:-)
44  <p>オブジェクト指向を取り入れて次のような感じでメッセージを  ($B$=$l$KB?$/$N(B code $B$G$O!"(B
45  構成したいところです。</p>  HTML $B$G$N%/%m%9%5%$%H%9%/%j%W%F%#%s%0(B (CSS) $BLdBj$H(B
46    $BN`;w$NLdBj$X$NBP=h$r$7$F$$$^$;$s!#(B)</p>
47  <pre class="application-x-perl">  
48  use Message::Entity;  <p>$B%*%V%8%'%/%H;X8~$r<h$jF~$l$F<!$N$h$&$J46$8$G%a%C%;!<%8$r(B
49  my $msg = new Message::Entity;  $B9=@.$7$?$$$H$3$m$G$9!#(B</p>
50  my $hdr = $msg-&gt;header;  
51  $hdr-&gt;add ('From')-&gt;add ('me@bar.example');  <pre class="application-x-perl">
52  $hdr-&gt;add ('To')-&gt;add ('foo@bar.example', display_name =&gt; 'Mr. foo');  use Message::Entity;
53  $hdr-&gt;add ('Subject' =&gt; $subject);  my $msg = new Message::Entity;
54  $msg-&gt;body ($body);  my $hdr = $msg-&gt;header;
55    $hdr-&gt;add ('From')-&gt;add ('me@bar.example');
56  # $smtp-&gt;send は SMTP で送信する method と仮定。  $hdr-&gt;add ('To')-&gt;add (['foo@bar.example', display_name =&gt; 'Mr. foo']);
57  $smtp-&gt;send ($msg);  $hdr-&gt;add (Subject =&gt; $subject);
58  </pre>  $msg-&gt;body ($body);
59    
60  <p><a href="http://www.cpan.org/" xml:lang="en">CPAN</a> を探すと、  # $smtp-&gt;send $B$O(B SMTP $B$GAw?.$9$k(B method $B$H2>Dj!#(B
61  これに似たようなことができそうなモジュールはあるようですが、  $smtp-&gt;send ($msg);
62  実際に使ってみると、与える値によっては <a href="urn:ietf:rfc:822">RFC 822</a>/<a href="urn:ietf:rfc:2822">2822</a> に違反する  </pre>
63  結果を出力するなどの不満があります。 (例えば今の例で  
64  <code xml:lang="en">To:</code> 領域に使っている  <p><a href="http://www.cpan.org/" xml:lang="en">CPAN</a> $B$rC5$9$H!"(B
65  <code xml:lang="en">display_name</code> で「.」が含まれますが、  $B$3$l$K;w$?$h$&$J$3$H$,$G$-$=$&$J%b%8%e!<%k$O$"$k$h$&$G$9$,!"(B
66  RFC 2822 的には新しいメッセージでは互換性のため  $B<B:]$K;H$C$F$_$k$H!"M?$($kCM$K$h$C$F$O(B <a href="urn:ietf:rfc:822">RFC 822</a>/<a href="urn:ietf:rfc:2822">2822</a> $B$K0cH?$9$k(B
67  <code xml:lang="en" class="bnf rfc2822">quoted-string</code>  $B7k2L$r=PNO$9$k$H$+!"$=$b$=$b$=$l0JA0$K!"(B
68  にする必要があります。しかしそのまま出力されます。)</p>  <code>$hdr->addr ('Foo Bar &lt;foo@bar.example>')</code>
69    $B$N$h$&$K%a%C%;!<%87A<0$r%b%8%e!<%kFb$K1#F?$7$-$l$F$$$J$$$H$+!"Hs(B
70  <p class="note">参考: 「.」の場合は RFC 2822 的には正しく解釈  ASCII $BJ8;z$r9MN8$7$F$$$J$$$H$+$NITK~$,$"$j$^$9!#(B</p>
71  されなければなりませんが (出力はすべきでない)、  
72  これ以外の文字、例えば制御文字 <code class="character">ESCAPE</code> でも同じようになります。  <p class="note">($B<BAuJ}?K$H$7$F$OIT@5$JCM$O%b%8%e!<%k$KEO$9A0$KCF$/$Y$-$H$$$&9M$(J}$b$"$k$G$7$g$&$1$I!"0lHLE*$JMxMQ$K:]$7$F$O8-$$@_7W$@$H$O;W$($^$;$s!#(B)</p>
73  こちらは完全に間違いです。</p>  
74  <p class="note">参考: 実装方針としては不正な値はモジュールに  <p>$B$H$$$&$3$H$G!"$O$8$a$O4{B8$N%b%8%e!<%k$N(B wrapper ($B$"$k$$$OJd40(B)
75  渡す前に弾くべきという考え方もあるでしょう。  $B$r=q$/$D$b$j$G$7$?$,!"$J$s$@$+$4$A$c$4$A$c$7$F$$$F!"(B
76  でもそんなのは不便です。</p>  $B$=$l$J$i<VNX$N:FH/L@$K$J$C$F$b0l$+$i=q$$$F$_$h$&$H9M$($^$7$?!#(B</p>
77    
78  <p>ということで、はじめは既存のモジュールの wrapper (あるいは補完)  <h2>$BFC?'(B ($B$H$$$&Dx$N$b$N$G$b$J$$!#(B)</h2>
79  を書くつもりでしたが、なんだかごちゃごちゃしていて、  
80  それなら車輪の再発明になっても一から書いてみようと考えました。</p>  <ol>
81    <li>$B7k9=%*%V%8%'%/%H;X8~$G$9!#(B</li>
82  <h2>特色 (という程のものでもない。)</h2>  <li>RFC 822/2822 $B$N(B <code class="bnf rfc2822">group</code> $B$r2r<a=PMh$^$9!#(B</li>
83    <li><a href="urn:ietf:id:draft-ietf-usefor-msg-id-alt-00">draft-ietf-usefor-msg-id-alt-00</a> $B$K4p$E$$$?Aw?.%"%I%l%9$J$I$K$h$k(B <code class="rfc2822">Message-ID</code> $B$r@8@.=PMh$^$9!#(B</li>
84  <ol>  <li><a href="charset" title="$BJ8;z%3!<%I$N07$$(B">$BJ8;z%3!<%IJQ49=hM}$r30It$KDI$$=P$7$F$$$^$9(B</a>$B!#(B
85  <li>結構(謎)オブジェクト指向です。</li>  jcode.pl $B$G$b(B Jcode.pm $B$G$b(B Encode::* $B$G$b!"9%$-$J$b$N$r$*;H$$2<$5$$!#(B</li>
86  <li>RFC 822/2822 の <code class="bnf rfc2822">group</code> を解釈出来ます。</li>  <li>MIME (<a href="urn:ietf:rfc:2045">RFC 2045</a>,
87  <li><a href="urn:ietf:id:draft-ietf-usefor-msg-id-alt-00">draft-ietf-usefor-msg-id-alt-00</a> に基づいた送信アドレスなどによる <code class="rfc2822">Message-ID</code> を生成出来ます。</li>  <a href="urn:ietf:rfc:2046">2046</a>) $B$K$[$\40A4$KBP1~$7$F$$$^$9!#(B</li>
88  <li>文字コード独立 (CSI) です。 (但し RFC 822 である都合上(謎)、  </ol>
89  ASCII 互換である必要はあります。 EBCDIC とかは無理です:-&lt;)</li>  
90  </ol>  <h2>$B3F;EMM$X$NBP1~>u67(B</h2>
91    
92  <h2>各仕様への対応状況</h2>  <ol>
93    <li>$BEE;R%a%$%k$N%a%C%;!<%8(B (RFC 822, RFC 2822)
94  <ol>  $B$NA45!G=$KBP1~$7$F$$$^$9!#(B</li>
95  <li>電子メイルのメッセージ (RFC 822, RFC 2822)  <li>$BEE;R%K%e!<%95-;v(B (<a href="/uri-res/N2L?urn:ietf:rfc:1036">RFC 1036</a>,
96  の全機能に (抜けが無ければ) 対応しています。  <a href="spec/son-of-RFC1036">son-of-RFC1036</a>,
97  但し長さ制限などはチェックしていません。 (MIME の  <a href="/uri-res/N2L?urn:ietf:id:draft-usefor-article-06">
98  <code class="mime">Content-Transfer-Encoding</code>  draft-usefor-article (06)</a>) $B$NF,NN0h$NB?$/$KBP1~$7$F$$$^$9!#(B</li>
99  と一緒に実装予定)</li>  <li>MIME $B$NK\J8ItJ,(B (body part) $B$KBP1~$7$F$$$^$9!#(B
100  <li>電子ニュース記事 (<a href="/uri-res/N2L?urn:ietf:rfc:1036">RFC 1036</a>,          <ul>
101  <a href="spec/son-of-RFC1036">son-of-RFC1036</a>,          <li>$BB?ItJ,(B (multipart) $B$dJ,3d(B (message/partial),
102  <a href="/uri-res/N2L?urn:ietf:id:draft-usefor-article-06">          $B30ItK\J,(B (message/external-body) $B$r07$&$3$H$,=PMh$^$9!#(B</li>
103  draft-usefor-article (06)</a>) の頭領域の多くに対応しています。</li>          <li>text/plain; format=flowed
104  <li>MIME の本体部分 (body part) にはまだ対応していません。</li>          (<a href="urn:ietf:rfc:2646">RFC 2646</a>)
105  <li>MIME の追加頭領域          $B$KBP1~$7$F$$$^$9!#(B</li>
106  (<a href="/uri-res/N2L?urn:ietf:rfc:2045">RFC 2045</a>,          <li>Content-Transfer-Encoding $B$O(B Base64, Quoted-Printable
107  <code class="mime">Content-Disposition</code>) に対応しています。          $B$OL^O@!"(B x-uuencode, x-gzip64 $B$K$bBP1~!#(B
108  パラメーター値拡張 (<a href="/uri-res/N2L?urn:ietf:rfc:2231">RFC 2231</a>)          RFC 2822 $B%a%$%k=PNO%b!<%I$G$O!"K\J8$,(B8$B%S%C%H$G$b<+F0E*$KE,@Z$J(B
109  も入出力ともに実装しました。</li>          CTE $B$GId9f2=$7$^$9!#(B</li>
110  <li>MIME 符号化語 (<code class="mime bnf">encoded-word</code>)          </ul>
111  の解読に対応しています:-) 但し別途変換処理を指定する必要があります。  </li>
112  (<a href="#code">文字コードの扱い</a>参照)</li>  <li>MIME $B$NF,NN0h(B
113  <li>HTTP/1.0, HTTP/1.1, CGI/1.1, CGI/1.2 の頭領域のうち、  (<a href="/uri-res/N2L?urn:ietf:rfc:2045">RFC 2045</a>,
114  ごく一部に対応しています。 MHTML の  <code class="mime">Content-Disposition</code>) $B$KBP1~$7$F$$$^$9!#(B
115  <code class="mime">Content-Location</code> にも対応しています。</li>  $B%Q%i%a!<%?!<CM3HD%(B (<a href="/uri-res/N2L?urn:ietf:rfc:2231">RFC 2231</a>)
116  <li>日付形式では RFC 822/<a href="urn:ietf:rfc:1123">1123</a>,  $B$bF~=PNO$H$b$K<BAu$7$^$7$?!#(B</li>
117  <a href="urn:ietf:rfc:733">RFC 733</a>, asctime, ISO 8601 (HTML)  <li>MIME $BId9f2=8l(B (<code class="mime bnf">encoded-word</code>)
118  などに対応しています。</li>  $B$N2rFI$KBP1~$7$F$$$^$9(B:-)</li>
119  </ol>  <li>HTTP/1.0, HTTP/1.1, CGI/1.1, CGI/1.2 $B$NF,NN0h$N$&$A!"(B
120    $B$4$/0lIt$KBP1~$7$F$$$^$9!#(B MHTML $B$N(B
121  <h2>制限事項</h2>  <code class="mime">Content-Location</code> $B$K$bBP1~$7$F$$$^$9!#(B</li>
122    <li>$BF|IU7A<0$G$O(B RFC 822/<a href="urn:ietf:rfc:1123">1123</a>,
123  <ol>  <a href="urn:ietf:rfc:733">RFC 733</a>, asctime, ISO 8601 (HTML)
124  <li>類似モジュール(謎)のように、ファイル名やファイル・ハンドルを  $B$J$I$KBP1~$7$F$$$^$9!#F|IU$N=PNO$O(B sprintf
125  渡して読み込ませることが出来ません。</li>  $B$NMM$J=q<0J8;zNs$rM?$($k$3$H$G!"B?<oB?MM$J7A<0$KBP1~!#(B</li>
126  <li>大きなメッセージでも一気に読み込み、全て主記憶領域で  <li>X-Moe $B%7%j!<%:$KBP1~$7$F$$$^$9(B:-)</li>
127  保持しています。ですからあまり大きなメッセージの処理には  </ol>
128  向いていないでしょう。</li>  
129  <li><code>CR</code> や <code>LF</code> が単体で出現する場合、  <h2>$B@)8B;v9`(B</h2>
130  正しく処理出来ません。 (<code>CRLF</code> と等価とみなします。)  
131  将来の版ではオプションで制御可能になるかもしれません。</li>  <ol>
132  <li>あったら良さそうな機能が未実装かもしれません。  <li>$BN`;w%b%8%e!<%k(B($BFf(B)$B$N$h$&$K!"%U%!%$%kL>$d%U%!%$%k!&%O%s%I%k$r(B
133  (<a href="mailto:w@suika.fam.cx">電子メイル</a>などで教えて下さい。)</li>  $BEO$7$FFI$_9~$^$;$k$3$H$,=PMh$^$;$s!#(B</li>
134  <li>各モジュールのオプション体系があまり整備されていません。  <li>$BBg$-$J%a%C%;!<%8$G$b0l5$$KFI$_9~$_!"A4$F<g5-21NN0h$G(B
135  (それでも気持ち悪くない程度には体系的だと思います。)</li>  $BJ];}$7$F$$$^$9!#$G$9$+$i$"$^$jBg$-$J%a%C%;!<%8$N=hM}$K$O(B
136  <li>説明文 (document) が良い加減です。</li>  $B8~$$$F$$$J$$$G$7$g$&!#(B</li>
137  </ol>  <li><code>CR</code> $B$d(B <code>LF</code> $B$,C1BN$G=P8=$9$k>l9g!"(B
138    $B@5$7$/=hM}=PMh(B<del>$B$^$;$s(B</del><ins>$B$J$$$3$H$,$"$j$^$9(B
139  <h2>今後の予定</h2>  ($B6a$$>-Mh$NHG$G2~A1$NM=Dj(B)</ins>$B!#(B (<code>CRLF</code> $B$HEy2A$H$_$J$7$^$9!#(B)
140    $B>-Mh$NHG$G$O%*%W%7%g%s$G@)8f2DG=$K$J$k$+$b$7$l$^$;$s!#(B</li>
141  <ol>  <li>$B@bL@J8(B (document; pod) $B$,$$$$2C8:$G$9(B ($B=q$/$N$,LLE]$@(B)$B!#(B</li>
142  <li>電子ニュースの頭領域 (RFC 1036,  </ol>
143  <a href="spec/son-of-RFC1036">son-of-RFC1036</a>,  
144  draft-usefor-article) の完全実装</li>  <h2>$BI,MW4D6-(B</h2>
145  <li><del>MIME の頭領域の実装。</del></li>  
146  <li>追加/非標準の頭領域の実装。</li>  <ol>
147  <li>MIME 本体 (<code class="bnf rfc822">body</code>) の実装。</li>  <li>Perl 5.6 $B0J9_(B
148  <li><del>文字符号変換のための hook の実装?</del></li>          <p class="note"><code class="bnf rfc822">comment</code>
149  <li>documentation。</li>          $B$rI=$9$N$K@55,I=8=(B
150  <li>使用例の作成。</li>          <code class="regex">(??{ <var>code</var> })</code>
151  </ol>          $B$r;H$C$F$$$k$N$G!"$3$l$r2r<a=PMh$k!"(B
152            5.6 $B0J9_$NHG$G$"$kI,MW$,$"$j$^$9!#(B</p>
153  <h2>必要環境</h2>  </li>
154    <li>Digest::MD2, Digest::MD5, Digest::SHA1
155  <ol>          <p>Message-ID $B$N@8@.$K$3$l$i$r;HMQ$9$k>l9g$N$_!"(B
156  <li>Perl (perl 5.6 以降または<span title="human parser">人間解析者</span>:-))          Message::Field::MsgID $B$,;H$$$^$9!#(B</p>
157          <p class="note"><code class="bnf rfc822">comment</code>          <p><code class="bnf mime">Content-MD5:</code> $BNN0h$NIU2C$d8!>Z$r9T$&>l9g!"(B
158          を表すのに正規表現 <code class="regex">(??{ <var>code</var> })</code>          Digest::MD5 $B$,I,MW$G$9!#(B (Message::Entity)</p>
159          を使っているので、これを解釈出来る、  </li>
160          5.6 以降の版である必要があります。</p>  <li>MIME::Base64
161  </li>          <p>$B$A$J$_$K!"(B Quoted-Printable $B$d(B RFC 2231 $B$N(B
162  <li>Digest::MD2, Digest::MD5, Digest::SHA1          % $BId9f2=$O<+NO$GI|9f$7$^$9!#(B</p>
163          <p>Message-ID の生成にこれらを使用する場合のみ、  </li>
164          <code>Message::Field::MsgID::MsgID</code> が使います。</p>  <li>$BJ8;z%3!<%IJQ49=hM}(B
165          <p>これらが用意されていない環境ではエラーになるので、          <p>$BF|K\8l%a%C%;!<%8$r07$&$J$iI,?\$G$7$g$&!#(B
166          (現状では) 上記モジュールの該当部分を書き換えて対処して下さい。</p>          $B>\$7$/$O(B<a href="#code">$BJ8;z%3!<%I$N07$$(B</a>
167  </li>          $B$N>O$r$4;2>H2<$5$$!#(B</p>
168  <li>文字コード変換処理  </li>
169          <p>日本語メッセージを扱うなら必須でしょう。  </ol>
170          詳しくは<a href="#code">文字コードの扱い</a>  
171          の章をご参照下さい。</p>  <h2>$BF~<j(B</h2>
172  </li>  
173  </ol>  <p>suika.fam.cx $B$N(B SSH account $B$r$*;}$A$N>l9g!"(B CVS $B$+$iF~<j=PMh$^$9!#(B</p>
174    
175  <h2>入手</h2>  <p class="example"><samp>$ </samp><kbd>cvs -d :ext:<var xml:lang="en">username</var>@suika.fam.cx:/home/cvs co messaging/manakai</kbd></p>
176    
177  <p>suika.fam.cx の SSH account をお持ちの場合、 CVS から入手出来ます。</p>  <p>Web $B$+$i$b<h$j=P$;$^$9(B:
178    <code class="uri">&lt;<a href="/gate/cvs/messaging/manakai/">http://suika.fam.cx/gate/cvs/messaging/manakai/</a>&gt;</code></p>
179  <p class="example">$ cvs -d :ext:<var xml:lang="en">username</var>@suika.fam.cx:/home/cvs -d perl/lib/Message/</p>  
180    <p><a href="/gate/cvs/messaging/manakai/manakai.tar.gz?tarball=1">$B:G?73+H/HG(B
181  <p>Web からも取り出せます。 &lt;<a href="/gate/cvs/perl/lib/Message/">http://suika.fam.cx/gate/cvs/perl/lib/Message/</a>&gt; (tarball で一括取得も出来ます。)</p>  snapshot $B$N(B tarball $B$r<hF@(B</a>$B$9$k$3$H$b$G$-$^$9!#(B</p>
182    
183  <h2>ライセンス</h2>  <h2>$B%i%$%;%s%9(B</h2>
184    
185  <p>Message::* Perl modules は自由ソフトウェアです。  <p>manakai $B$O<+M3%=%U%H%&%'%"$G$9!#(B
186  GNU GPL に従って利用出来ます。詳しくは各ファイルを御覧下さい。</p>  <a href="http://www.gnu.org/">GNU</a>
187    <a href="/c/gnu/gpl">GPL</a> $B$K=>$C$FMxMQ=PMh$^$9!#(B
188  <h2>参考文献</h2>  $B>\$7$/$O3F9=@.%U%!%$%k$r8fMw2<$5$$!#(B</p>
189    
190  <ul>  <h2>$B4XO"J8=q$J$I(B</h2>
191  <li><a href="spec/">関連する仕様書 (RFC, Internet-Draft 等)</a></li>  
192  </ul>  <ul>
193    <li id="code"><a href="charset">$BJ8;z%3!<%I$N07$$(B</a></li>
194  <h2 id="code">文字コードの扱い</h2>  <li><a href="/~wakaba/-temp/wiki/wiki?manakai">SuikaWiki:manakai</a></li>
195    </ul>
196  <p>卑しいことで頭を悩ますのは嫌なので(藁)、  
197  Message::* は符号化方法独立 (CSI) を目指して実装しています。  <h2>$B1~MQ(B</h2>
198  (但し ASCII のしがらみだけは断ち切っていません:-))  
199  0x00 〜 0x7F が ASCII (または ASCII と見なして良いもの) である  <ul>
200  場合は、 Message::* を通したことでデータが壊れることは  <li><a href="/gate/cvs/tool/bunshin/">Bunshin.pm</a>
201  無いと思います。</p>          <p>Web $B>e$NO"B3$9$k;q8;(B ($B7G<(HD$N5-;v$N$h$&$J$b$N(B)
202            $B$r@Z$j=P$7$F(B RFC 822 $B7A<0$N%a%C%;!<%8$K$9$k%(%s%8%sItJ,!#(B</p>
203  <p>(もちろん、 RFC 822 など各仕様に照らして正統(的)で  </li>
204  ある必要があります。 <code class="bnf rfc822">atom</code>  <li><a href="/gate/cvs/tool/suikawari/">$B$9$$$+$o$j(B</a>
205  に8ビット・コードが含まれていると正しく扱えません。)          <p>Bunshin.pm $B$r;H$C$F!"EE;R%K%e!<%9$K5-;v$rEj9F$9$k(B
206  (早い話が、 <code class="bnf rfc822">quoted-string</code>          script$B!#(B (cron $B$H$+$+$i8F$S=P$7$F;H$&!#(B)</p>
207  などでは8ビット透過だということです。回りくどくてごめんなさい。)</p>  </li>
208    </ul>
209  <p>既定の状態では文字コードに関係する変換処理は行われません。  
210  しかし、フック関数っぽいもの(謎)を指定することで、  <h2>$B:#8e$NM=Dj(B</h2>
211  変換処理をさせられます。</p>  
212    <ol>
213  <p>指定出来るフック関数っぽいものは2種類です。  <li>$BEE;R%K%e!<%9$NF,NN0h(B (RFC 1036,
214  <code>DECODER</code> は、元のメッセージを解析する時  <a href="spec/son-of-RFC1036">son-of-RFC1036</a>,
215  (<code class="perl">parse ()</code>) に適宜呼び出されます。  draft-usefor-article) $B$N40A4<BAu(B</li>
216  <code>ENCODER</code> は、メッセージとして文字列化する際  <li>$BDI2C(B/$BHsI8=`$NF,NN0h$N<BAu!#(B</li>
217  (<code class="perl">stringify ()</code> など) に適宜呼び出されます。</p>  <li>documentation$B!#(B</li>
218    <li>$B;HMQNc$N:n@.!#(B</li>
219  <p>これらの関数は、当然、当該処理が呼び出される前に指定しておく  <li>$B4{B8%b%8%e!<%k$,MxMQ=PMh$kItJ,$O!"$=$l$r8F$S=P$9$h$&$K$9$k$+(B
220  必要があります。  $B$=$N(B code $B$rN.MQ$9$k!#(B</li>
221  <samp class="perl">Message::Entity-&gt;parse</samp> などする前に  <li>$BN`;w%b%8%e!<%k$H$N3&LL$N6&DL2=(B</li>
222  定義しておくと良いでしょう。</p>  <li>HTTP $BMQ$K;H$($k$h$&$K$9$k(B</li>
223    </ol>
224  <pre class="example perl">  
225  require Message::MIME::Charset;  <div class="navigation">
226  $Message::MIME::Charset::DECODER{'*default'} = sub {jcode::euc ($_[1])};  [<a href="/" title="$B$3$N%5!<%P!<$N<sJG(B">/</a>
227  $Message::MIME::Charset::ENCODER{'*default'} = sub {jcode::jis ($_[1], 'euc')};  <a href="/map" title="$B$3$N%5!<%P!<$N0FFb(B" rel="index">$BCO?^(B</a>
228  </pre>  <a href="/search/" title="$B$3$N%5!<%P!<$N8!:w(B">$B8!:w(B</a>]
229    <a href="http://validator.w3.org/check/referer" xml:lang="en"><img
230  <p>この例では、 jcode.pl を変換処理に使います。          src="http://www.w3.org/Icons/valid-xhtml11" id="w3c-html"
231  (もちろん、既に <code class="perl">require</code>          alt="Valid XHTML 1.1!" style="height: 31px; width: 88px" /></a>
232  されていると仮定しています。)</p>  <a href="http://jigsaw.w3.org/css-validator/validator?uri=http://suika.fam.cx/~wakaba/Message-pm/introduction.ja.html" xml:lang="en">
233  <p>最初の <code class="perl">require</code> で、変換処理を担当している    <img style="width: 88px; height: 31px" id="w3c-css"
234  <code class="perl">Message::MIME::Charset</code> を読み込みます。         src="http://jigsaw.w3.org/css-validator/images/vcss"
235  (こうしておかないと、後から既定値 (= 無変換) で         alt="Valid CSS!" /></a>
236  <code class="perl">*default</code> が上書きされてしまいます。)</p>  </div>
237    <div class="update">$Date$</div>
238  <p>この code を使ったスクリプトは内部処理を日本語 EUC  <ul class="myuri">
239  で行うと仮定しています。ですから、 <code class="perl">DECODER</code>  <li>&lt;URL:<a href="http://suika.fam.cx/~wakaba/Message-pm/introduction">http://suika.fam.cx/~wakaba/Message-pm/introduction</a>&gt;</li>
240  で日本語 EUC に変換します。</p>  <li>&lt;CVS:<a href="http://suika.fam.cx/gate/cvs/perl/web/Message-pm/">suika.fam.cx:/home/cvs/perl/web/Message-pm/</a>&gt;</li>
241  <p>また、日本語メッセージでは <code>ISO-2022-JP</code>  </ul>
242  を使うのが慣習ですから、 <code class="perl">ENCODER</code>  </body></html>
 では 7ビット JIS に変換しています。</p>  
 <p>処理を行う関数は、引数が2つ以上与えられます。  
 1つ目の引数は呼び出した class module, いわゆる  
 <code class="perl">$self</code> です。(この場合 self ではありませんが:-)  
 でも普通は必要ないでしょう。</p>  
 <p>2つ目の引数は処理対象の文字列です。</p>  
 <p>3つ目以降の引数は、追加オプションのハッシュです。  
 ただし、現在追加オプションは定義されていません。</p>  
 <p>関数が返す値は(今のところ)一つだけです。  
 処理が終わった文字列です。変換結果として何もなくなってしまったら、  
 もちろん空文字列を返して構いません。 (<code class="perl">undef</code>  
 よりも空文字列の方が望ましいでしょう。)</p>  
   
 <p>さて、上記の例では「<code>*default</code>」の EN/DECODER  
 を指定しましたが、ここには代わりに charset 名を指定出来ます。</p>  
   
 <pre class="perl example">  
 $Message::MIME::Charset::DECODER{'iso-2022-jp'} = sub {jcode::euc ($_[1], 'jis')};  
 </pre>  
   
 <p>ここでは、 <code>ISO-2022-JP</code> を内部コードに変換する  
 方法を定義しています。 charset 名 (および「<code>*default</code>」  
 は必ず小文字で書いて下さい!)</p>  
 <p>MIME body や、 encoded-word, RFC 2231 の拡張パラメーター値  
 など、 charset が指定されている時はその charset 名の変換関数が  
 呼び出されます。 (指定された charset 名の変換関数が未定義の時は、  
 何も処理しません。) これ以外の場面では、 <code>*default</code>  
 で定義された関数が使われます。</p>  
   
 <p>最後に、日本語メッセージを扱う際の例を挙げておきます。</p>  
   
 <pre class="example perl">  
 <span class="comment">## jcode.pl を使用</span>  
 require 'jcode.pl';  
 require Message::MIME::Charset;  
 $Message::MIME::Charset::DECODER{'*default'} = sub {jcode::euc ($_[1])};  
 $Message::MIME::Charset::DECODER{'iso-2022-jp'} = sub {jcode::euc ($_[1], 'jis')};  
 $Message::MIME::Charset::DECODER{'euc-jp'} = sub {$_[1]};  
 $Message::MIME::Charset::DECODER{'shift_jis'} = sub {jcode::euc ($_[1], 'sjis')};  
 $Message::MIME::Charset::ENCODER{'*default'} = sub {  
   my $s = $_[1];  
   <span class="comment">## 正規化</span>  
   jcode::tr(\$s,  
       "\xa3\xb0-\xa3\xb9\xa3\xc1-\xa3\xda\xa3\xe1-\xa3\xfa\xa1\xf5".  
       "\xa1\xa4\xa1\xa5\xa1\xa7\xa1\xa8\xa1\xa9\xa1\xaa\xa1\xae".  
       "\xa1\xb0\xa1\xb2\xa1\xbf\xa1\xc3\xa1\xca\xa1\xcb\xa1\xce".  
       "\xa1\xcf\xa1\xd0\xa1\xd1\xa1\xdc\xa1\xf0\xa1\xf3\xa1\xf4".  
       "\xa1\xf6\xa1\xf7\xa1\xe1\xa2\xaf\xa2\xb0\xa2\xb2\xa2\xb1".  
       "\xa1\xe4\xa1\xe3\xA1\xC0\xA1\xA1"  
       => '0-9A-Za-z&amp;,.:;?!`^_/|()[]{}+$%#*@=\'"~-&gt;&lt;\\ ');  
   jcode::jis ($s, 'euc', 'z')  
 };  
 </pre>  
   
 <pre class="example perl">  
 <span class="comment">## Jcode.pm を使用</span>  
 use Jcode;  
 require Message::MIME::Charset;  
 $Message::MIME::Charset::DECODER{'*default'} = sub {jcode::euc ($_[1])};  
 $Message::MIME::Charset::DECODER{'iso-2022-jp'} = sub {Jcode->new ($_[1], 'jis')->euc};  
 $Message::MIME::Charset::DECODER{'euc-jp'} = sub {$_[1]};  
 $Message::MIME::Charset::DECODER{'shift_jis'} = sub {Jcode->new ($_[1], 'sjis')->euc};  
 $Message::MIME::Charset::DECODER{'utf-8'} = sub {Jcode->new ($_[1], 'utf8')->euc};  
 $Message::MIME::Charset::ENCODER{'*default'} = sub {Jcode-&gt;new ($_[1], 'euc')-&gt;jis};  
 $Message::MIME::Charset::ENCODER{'utf-8'} = sub {Jcode-&gt;new ($_[1], 'euc')-&gt;utf8};  
 </pre>  
   
 <p>Perl 5.8 で Encode モジュールが使えるようになれば、  
 もっと楽になると期待しています。</p>  
   
 <div class="navigation">  
 [<a href="/" title="このサーバーの首頁">/</a>  
 <a href="/map" title="このサーバーの案内" rel="index">地図</a>  
 <a href="/search/" title="このサーバーの検索">検索</a>]  
 <a href="http://validator.w3.org/check/referer" xml:lang="en"><img  
         src="http://www.w3.org/Icons/valid-xhtml11" id="w3c-html"  
         alt="Valid XHTML 1.1!" style="height: 31px; width: 88px" /></a>  
 <a href="http://jigsaw.w3.org/css-validator/validator?uri=http://suika.fam.cx/~wakaba/Message-pm/introduction.ja.html" xml:lang="en">  
   <img style="width: 88px; height: 31px" id="w3c-css"  
        src="http://jigsaw.w3.org/css-validator/images/vcss"  
        alt="Valid CSS!" /></a>  
 </div>  
 <div class="update">$Date$</div>  
 <ul class="myuri">  
 <li>&lt;URL:<a href="http://suika.fam.cx/~wakaba/Message-pm/introduction">http://suika.fam.cx/~wakaba/Message-pm/introduction</a>&gt;</li>  
 <li>&lt;CVS:<a href="http://suika.fam.cx/gate/cvs/perl/web/Message-pm/">suika.fam.cx:/home/cvs/perl/web/Message-pm/</a>&gt;</li>  
 </ul>  
 </body></html>  

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.8

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24