[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. 基本的な関数

この章は、下位の階層に位置していて、解析と処理を行なうための基本的な関数 について説明します。ここで扱うことは From 行の解析、ヘッダーの各 行にあるコメントの削除、エンコードされた語のデコード、時刻ヘッダーの解析 などです。上位階層の機能は最初の章 (see section デコードと表示) で扱わ れています。

訳注: RFC822bis == draft-ietf-drums-msg-fmt-09.txt


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 rfc2045

RFC2045 は「主要な」MIME の文献です。ならば、そこにはたくさん の実装があるだろうと想像するでしょう。しかし、ほとんどの詳細な実装はその 後の RFC に委ねられていて、そこにはありません。

と言うわけで ‘rfc2045.el’ にはたった一つの関数があります:

rfc2045-encode-string

パラメーターと値を受け取り、‘PARAM=VALUE’ の形式の文字列を返します。 value に安全ではない文字があったらクォートされ ("..." で囲まれ) ま す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 rfc2231

RFC2231 は Content-TypeContent-Disposition ヘッダーの 構文を定義します。その小粋な名称は「MIME パラメーター値と符号 化単語拡張文字セット・言語そして継続」です。

一口で言うと、それらのヘッダーはこんなふうです:

 
Content-Type: application/x-stuff;
 title*0*=us-ascii'en'This%20is%20even%20more%20;
 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
 title*2="isn't it!"

普通はこんなにひどくないですが。

以下の関数がこのライブラリーで定義されています:

rfc2231-parse-string

Content-Type ヘッダーを解析して、その要素を表すリストを返します。

 
(rfc2231-parse-string
 "application/x-stuff;
 title*0*=us-ascii'en'This%20is%20even%20more%20;
 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
 title*2=\"isn't it!\"")
⇒ ("application/x-stuff"
    (title . "This is even more ***fun*** isn't it!"))
rfc2231-get-value

上記の形式のリストの一つを受け取り、指定された属性の値を返します。

rfc2231-encode-string

Content-TypeContent-Disposition のようなヘッダーに入れ るパラメーターをエンコードします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 ietf-drums

drums は RFC822 の置き換え作業をしている IETF の作業部会です。

このライブラリーによって提供される関数は次の通りです:

ietf-drums-remove-comments

引数からコメントを取り除いて、結果を返します。

ietf-drums-remove-whitespace

文字列から“linear white space”を取り除き、結果を返します。クォートされ た ("..." で囲まれた) 文字列の中にある空白文字とコメントには手を付けませ ん。

訳注:“linear white space”とは一つ以上の空白文字のことで、その前に改行 文字を置いたものは、長いヘッダーを折り畳むときに使われます。

ietf-drums-get-comment

文字列の最後尾にあるコメントを返します。

ietf-drums-parse-address

アドレスの文字列を解析して、メールアドレスとプレーンテキストの名前を含む リストを返します。

ietf-drums-parse-addresses

カンマで区切られた複数のアドレスを含んでいる文字列を解析して、メールアド レスとプレーンテキストの対を含むリストを返します。

ietf-drums-parse-date

日付の文字列を解析して、Emacs 形式の時刻を返します。

ietf-drums-narrow-to-header

現在のバッファーをヘッダーの区域に狭めます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 rfc2047

RFC2047 (メッセージ・ヘッダーでの非-ASCII テキスト拡張) は、ヘッ ダーにある非-ASCII テキストをどのようにエンコードするかを定め ています。実際これは少々複雑になるので、このライブラリーが行なうことを調 整するために、多くの変数が必要です。

以下の変数が調整可能です:

rfc2047-header-encoding-alist

これはヘッダーとエンコーディング・タイプの対を収めた連想リストです。その 主な目的は、ある種のヘッダーがエンコードされないようにすることです。

鍵 (訳注: 各要素の car 項) はヘッダーに合致する正規表現 か t のどちらかです。

値 (訳注: 各要素の cdr 項) は nil にすることができて、その 場合、鍵に相当するヘッダーはエンコードされません。mime はそれらを エンコードすることを意味しますが、address-mime の場合はヘッダーが アドレスを含んでいることを想定して注意深くエンコードします。

rfc2047-charset-encoding-alist

RFC2047 は二つのエンコーディングの形式を定めています。一つは Q (Quoted-Printable のようなエンコーディング) で、もう一つは B (base64) です。この連想リストは、ある文字セットに対してどのエンコーディ ングを使うかを規定します。

rfc2047-encode-function-alist

これはエンコーディングとそれを実施するための関数の対を収めた連想リストで す。エンコーディングとは Q, B および nil のことです。

rfc2047-encoded-word-regexp

デコードを行なうとき、このライブラリーはこの正規表現に合致するものを探し ます。

rfc2047-encoded-word-regexp-loose

rfc2047-encoded-word-regexp の Q エンコーディングのための正規表現 を緩慢にしたバージョンです。

rfc2047-encode-encoded-words

エンコード済みの語 (例えば ‘hello’) を再度エンコード するかどうかを決めるブール変数です。 rfc2047-encoded-word-regexp がそのような語を探すために使われます。

rfc2047-allow-irregular-q-encoded-words

いい加減に Q でエンコードされた語 (例え ば ‘hello?’) をデコードすべきかどうかを決めるブール 変数です。それが nil 以外の値ならば、エンコードされた語を探すため に rfc2047-encoded-word-regexp に代わっ て rfc2047-encoded-word-regexp-loose が使われます。

以上は変数でした。次は関数です:

rfc2047-narrow-to-field

バッファーを現在の行のヘッダーに狭めます。

rfc2047-encode-message-header

メッセージのヘッダーに狭められたバッファーで使わなければなりません。 rfc2047-header-encoding-alist に従ってエンコードを行ないます。

rfc2047-encode-region

指定された領域にあるすべてのエンコード可能な語をエンコードします。

rfc2047-encode-string

文字列をエンコードして結果を返します。

rfc2047-decode-region

領域にあるエンコードされた語をデコードします。

rfc2047-decode-string

文字列をデコードして結果を返します。

rfc2047-encode-parameter

パラメーターを RFC2047 ふうの様式でエンコードします。これは関 数 rfc2231-encode-string の代用です。それが標準なのですが、多くの メイラーがサポートしません。See section rfc2231.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 time-date

本当は MIME ライブラリーの一部ではありませんが、ここで説明する ことは都合が良いのです。これは日付ヘッダーの解析と時刻の操作を扱います。 (もっとも四次元立方体は使いません。ごめんなさい。)

これらの関数は五つの形式 (時刻の文字列、Emacs 形式の時刻、デコードされた 時刻のリスト、秒数、および日数) の間で変換を行ないます。

時刻/日付/秒数/日数の相互変換の例です:

 
(parse-time-string "Sat Sep 12 12:21:54 1998 +0200")
⇒ (54 21 12 12 9 1998 6 nil 7200)

(date-to-time "Sat Sep 12 12:21:54 1998 +0200")
⇒ (13818 19266)

(time-to-seconds '(13818 19266))
⇒ 905595714.0

(seconds-to-time 905595714.0)
⇒ (13818 19266 0)

(time-to-days '(13818 19266))
⇒ 729644

(days-to-time 729644)
⇒ (961933 65536)

(time-since '(13818 19266))
⇒ (0 430)

(time-less-p '(13818 19266) '(13818 19145))
⇒ nil

(subtract-time '(13818 19266) '(13818 19145))
⇒ (0 121)

(days-between "Sat Sep 12 12:21:54 1998 +0200"
              "Sat Sep 07 12:21:54 1998 +0200")
⇒ 5

(date-leap-year-p 2000)
⇒ t

(time-to-day-in-year '(13818 19266))
⇒ 255

(time-to-number-of-days
 (time-since
  (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT")))
⇒ 4.146122685185185

あと、safe-date-to-time というものもあります。これ は date-to-time と同じことをしますが、日付が構文的に不完全だった 場合にゼロ時刻を返します。

五つのデータは以下のように表現されます:

date

RFC822 (または類似の) 形式の日付の文字列。例: "Sat Sep 12 12:21:54 1998 +0200"

time

Emacs の内部形式の時刻。例: (13818 26466)

seconds

Emacs の内部形式の時刻を浮動小数で表したもの。例: 905595714.0

days

00000101 を基点とする経過日数を整数で表したもの。例: 729644

訳注: 00000101 が何を意味するのか不明ですが、ソースコードによればグレゴ リオ歴・紀元前 (BC ではなく BCE の方の) 0001年12月31日のことらしいです。

decoded time

デコードされた時刻のリスト。例: (54 21 12 12 9 1998 6 t 7200)

上記のすべての例は、同じ時を表しています。

関数には以下のようなものがあります:

date-to-time

日付を受け取って時刻を返します。

time-to-seconds

時刻を受け取って秒数を返します。Emacs にはそれを行なう組み込み関 数 float-time があることに注意してください。

seconds-to-time

秒数を受け取って時刻を返します。

time-to-days

時刻を受け取って日数を返します。

days-to-time

日数を受け取って時刻を返します。

date-to-day

日付を受け取って日数を返します。

time-to-number-of-days

時刻を受け取って、それが表している日数を返します。

safe-date-to-time

日付を受け取って時刻を返します。日付が構文的に正しくなかったら「ゼロ」時 刻を返します。

time-less-p

二つの時刻を受け取って、一つ目が二つ目より少ない (すなわち早い) かどうか を示します。

time-since

時刻を受け取って、その時刻からどれほど時間が経過したかを示します。

subtract-time

二つの時刻を受け取って、一つ目から二つ目を減算します。すなわち、二つの時 刻の間の時間差を返します。

days-between

二つの日付を受け取って、それら二つの日付の間の日数を返します。

date-leap-year-p

年の数値を受け取って、それがうるう年かどうかを示します。

time-to-day-in-year

時刻を受け取って、その年の元日から経過した日数を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.6 qp

このライブラリーは Quoted-Printable によるテキストのデコードとエンコード を扱います。

非常に手短かに説明すれば、qp エンコーディングはすべての 8-bit 文字 (と多 くの制御文字) を ‘=EF’ のようなもの (イコール記号と、それに続 く 16進数にエンコードされたバイト) に変換することです。

このライブラリーでは、以下の関数が定義されています:

quoted-printable-decode-region

指定された領域にあるすべてのエンコードされたテキストを QP-デコードします。

quoted-printable-decode-string

文字列に含まれている QP-エンコードされたテキストをデコードして、結果を返 します。

quoted-printable-encode-region

指定された領域にあるすべてのエンコード可能な文字を QP-エンコードします。 省略できる第三引数 fold は、長い行を折り畳むかどうかを指定します。 (ここで「長い」は 72桁を越えるもののことを意味します。)

quoted-printable-encode-string

文字列に含まれているすべてのエンコード可能な文字を QP-エンコードして、結 果を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.7 base64

Base64 は 3-バイトを 4-バイトにエンコードします。そのため、約 33% サイズ が増えます。アルファベットだけでエンコードするので、伝送される途中で出会 うかもしれない障害に対してとても耐久力があります。

以下の関数がこのライブラリーによって定義されています:

base64-encode-region

選択された領域を base64 でエンコードして、エンコードされたテキストの長さ を返します。省略できる第三引数 no-line-break は、長い行をより短い 行に折り畳まないことを指図します。

base64-encode-string

文字列を base64 でエンコードして結果を返します。

base64-decode-region

選択された領域を base64 でデコードして、デコードされたテキストの長さを返 します。領域がデコード可能でなかったら、nil を返すだけでバッファー は変更しません。

base64-decode-string

文字列を base64 でデコードして結果を返します。文字列がデコード可能でなかっ たら nil を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.8 binhex

binhex はマッキントッシュの環境に源を発するエンコーディングです。 以下の関数がそれらを扱うために供給されています:

binhex-decode-region

領域にあるエンコードされたテキストをデコードします。第三パラメーターが与 えられると、binhex のヘッダーをデコードしてファイル名を返すことだ けをします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.9 uudecode

base64 がメールの世界を支配しているものの、おそら く uuencode はまだ Usenet で使われているものの中で、最も普及して いるバイナリーのエンコーディングです。

以下の関数がこのパッケージによって供給されています:

uudecode-decode-region

領域にあるテキストをデコードします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.10 yenc

yenc は Usenet でバイナリーをエンコードするために使われます。以下 の関数がこのパッケージによって供給されています:

yenc-decode-region

領域にあるエンコードされたテキストをデコードします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.11 rfc1843

RFC1843 はメッセージにおける中国語と ASCII 文字の混在文を扱い ます。本質的には、RFC1843 は以下のように ASCII と中国語を切り 替えるものです:

 
This sentence is in ASCII.
The next sentence is in GB.~{<:Ky2;S{#,NpJ)l6HK!#~}Bye.

まったく単純で、中国では広く使われています。

このエンコーディングを扱うために、以下の関数を使うことができます:

rfc1843-decode-region

領域にある HZ-エンコードされたテキストをデコードします。

rfc1843-decode-string

HZ-エンコードされた文字列をデコードして結果を返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.12 mailcap

~/.mailcap’ ファイルはほとんどの MIME に対応したメッセー ジ・ハンドラーによって解析されます。それには、各要素がどのように表示され るものと想定されているかを記述します。ファイルの例です:

 
image/*; gimp -8 %s
audio/wav; wavplayer %s
application/msword; catdoc %s ; copiousoutput ; nametemplate=%s.doc

これは、すべての画像ファイルは gimp で表示されるべきであること、 WAVE 音響ファイルは wavplayer で再生されるべきであること、そし て MS-WORD ファイルは catdoc によってインライン表示されるべきであ ると言っています。

mailcap ライブラリーはこのファイルを解析して、合致するタイプのた めの関数を提供します。

mailcap-mime-data

この変数は、バックアップされた (訳注: mailcap ファイルの内容を解析し て Emacs が扱い易い形式にした) 表示規則を含んでいる、連想リストの連想リ ストです。

インターフェース関数:

mailcap-parse-mailcaps

~/.mailcap’ ファイルを解析します。

mailcap-mime-info

引数として MIME タイプを受け取り、合致するビューワーを返します。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on May 11, 2011 using texi2html 1.82.