[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この章は、下位の階層に位置していて、解析と処理を行なうための基本的な関数
について説明します。ここで扱うことは From
行の解析、ヘッダーの各
行にあるコメントの削除、エンコードされた語のデコード、時刻ヘッダーの解析
などです。上位階層の機能は最初の章 (see section デコードと表示) で扱わ
れています。
4.1 rfc2045 | Content-Type ヘッダーのエンコード
| |
4.2 rfc2231 | Content-Type ヘッダーの解析
| |
4.3 ietf-drums | RFC822bis で定義されているメールヘッダーの処理 | |
4.4 rfc2047 | ヘッダーにある語のエンコードとデコード | |
4.5 time-date | 日付の解析と時刻を操作する関数 | |
4.6 qp | Quoted-Printable のエンコードとデコード | |
4.7 base64 | Base64 のエンコードとデコード | |
4.8 binhex | Binhex のデコード | |
4.9 uudecode | Uuencode のデコード | |
4.10 yenc | Yenc のデコード | |
4.11 rfc1843 | HZ-エンコードされたテキストのデコード | |
4.12 mailcap | パートの表示の仕方は ‘.mailcap’ ファイルに明記されている |
訳注: RFC822bis == draft-ietf-drums-msg-fmt-09.txt
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
RFC2045 は「主要な」MIME の文献です。ならば、そこにはたくさん の実装があるだろうと想像するでしょう。しかし、ほとんどの詳細な実装はその 後の RFC に委ねられていて、そこにはありません。
と言うわけで ‘rfc2045.el’ にはたった一つの関数があります:
rfc2045-encode-string
パラメーターと値を受け取り、‘PARAM=VALUE’ の形式の文字列を返します。 value に安全ではない文字があったらクォートされ ("..." で囲まれ) ま す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
RFC2231 は Content-Type
と Content-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-Type
と Content-Disposition
のようなヘッダーに入れ
るパラメーターをエンコードします。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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] | [ ? ] |
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] | [ ? ] |
本当は 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
と同じことをしますが、日付が構文的に不完全だった
場合にゼロ時刻を返します。
五つのデータは以下のように表現されます:
RFC822 (または類似の) 形式の日付の文字列。例: "Sat Sep 12 12:21:54
1998 +0200"
Emacs の内部形式の時刻。例: (13818 26466)
Emacs の内部形式の時刻を浮動小数で表したもの。例: 905595714.0
00000101 を基点とする経過日数を整数で表したもの。例: 729644
訳注: 00000101 が何を意味するのか不明ですが、ソースコードによればグレゴ リオ歴・紀元前 (BC ではなく BCE の方の) 0001年12月31日のことらしいです。
デコードされた時刻のリスト。例: (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] | [ ? ] |
このライブラリーは 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] | [ ? ] |
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] | [ ? ] |
binhex
はマッキントッシュの環境に源を発するエンコーディングです。
以下の関数がそれらを扱うために供給されています:
binhex-decode-region
領域にあるエンコードされたテキストをデコードします。第三パラメーターが与
えられると、binhex
のヘッダーをデコードしてファイル名を返すことだ
けをします。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
base64
がメールの世界を支配しているものの、おそら
く uuencode
はまだ Usenet で使われているものの中で、最も普及して
いるバイナリーのエンコーディングです。
以下の関数がこのパッケージによって供給されています:
uudecode-decode-region
領域にあるテキストをデコードします。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
yenc
は Usenet でバイナリーをエンコードするために使われます。以下
の関数がこのパッケージによって供給されています:
yenc-decode-region
領域にあるエンコードされたテキストをデコードします。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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] | [ ? ] |
‘~/.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.