\input texinfo-ja @c -*-texinfo -*- coding: utf-8 -*-
@c Generated automatically from mime-ja.sgml by sinfo 3.7.
@setfilename mime-ja.info
@documentlanguage ja
@documentencoding utf-8
@settitle FLIM-LB 1.14 MIME 機能説明書
@dircategory GNU Emacs Lisp
@direntry
* FLIM-LB (ja): (mime-ja). Internet message library.
@end direntry
@titlepage
@title FLIM-LB 1.14 MIME 機能説明書
@author 守岡 知彦 <morioka@@jaist.ac.jp>
@author 伊藤 和博
@subtitle 2020-09-17
@end titlepage
@node Top, Introduction, (dir), (dir)
@top FLIM-LB 1.14 MIME 機能説明書
@ifinfo
This file documents MIME features of FLIM-LB, a fundamental library to
process Internet Messages for GNU Emacsen.@refill
GNU Emacsen 用の Internet Message 処理のための基礎 library である FLIM-LB
の MIME 機能に関して説明します。
@end ifinfo
@menu
* Introduction:: FLIM-LB って何?
* How to use:: FLIM の MIME 機能の使い方
* Entity:: Message と Entity
* Content-Type:: Content-Type 欄の情報
* Content-Disposition:: Content-Disposition 欄の情報
* Content-Transfer-Encoding:: 符号化法
* encoded-word:: Header の network 表現
* custom:: 一般設定
* Appendix:: 付録
* Concept Index:: 概念索引
* Function Index:: 関数索引
* Variable Index:: 変数索引
@end menu
@node Introduction, How to use, Top, Top
@chapter FLIM-LB って何?
FLIM は Internet Message の表現や符号化に関する基礎的な機能を提供する
ための library です。
FLIM-LB は FLIM のバリアントの一つで、
最新バージョンの Emacs への対応などを特徴とします。
@node How to use, Entity, Introduction, Top
@chapter FLIM の MIME 機能の使い方
FLIM の提供する MIME 機能を使うためには
@lisp
(require 'mime)
@end lisp
@noindent
を評価してください。
@node Entity, Content-Type, How to use, Top
@chapter Message と Entity
@cindex mime-entity
@cindex entity
RFC 2045 (@ref{RFC 2045}) によれば、「Entity という語は、message, もしく
は、multipart entity の body 中の1つの部分の、MIME で定義された header
field と内容を指す」となっています。ここでは、MIME で定義された header
field 以外の全ての header と body を指す語として @strong{entity}を用いる
ことにします。@refill
RFC 2045 の定義は、MIME message が entity を節とする木構造であることを示
しています。つまり、MIME は message を木構造に拡張した訳です。@refill
FLIM は entity の情報を表現するために@strong{mime-entity} 構
造体を用います。以下では単に mime-entity と呼ぶことにします。
@menu
* Entity creation:: Entity の生成
* Entity hierarchy:: Entity 階層
* Entity Search:: Entity の検索
* Entity Attributes:: Entity の属性
* Entity-header:: Entity header の情報
* entity formatting:: Entity の文字表現
* Entity-content:: Entity の内容
* Entity-network-representation:: Entity のネットワーク表現
* Entity buffer:: Entity の buffer による表現
* mm-backend:: Entity の表現と実現
@end menu
@node Entity creation, Entity hierarchy, Entity, Entity
@section Entity の生成
@defun mime-open-entity type location
Entity を開いて、それを返します。@refill
@var{type} は representation-type です。(cf. @ref{mm-backend}) @refill
@var{location} は entity の位置です。指定方法は
representation-type に依って変わります。
@end defun
@defun mime-parse-buffer &optional buffer type
@var{buffer} を message として構文解析し、その結果の mime-entity を
@var{buffer} の@code{mime-message-structure} に格納する。@refill
@var{buffer} が省略された場合、現在の buffer を構文解析する。@refill
@var{type} が指定された場合、その値を生成される mime-entity の表象型とし
て用いる。省略された場合は @var{buffer} となる。(cf. @ref{mm-backend})
@end defun
@node Entity hierarchy, Entity Search, Entity creation, Entity
@section Entity 階層
@cindex node-id
@cindex entity-number
@cindex message
@cindex root-entity
MIME message は entity を単位とする木構造になっています。@refill
この木において根となる節は message 全体を表す entity です。ここでは、こ
れを @strong{root-entity} もしくは@strong{message} と呼びます。@refill
root-entity 以外の entity は親を持ちます。また、entity は子供を持つかも
知れません。この親子関係を考えることで entity の相対関係を扱うことができ
ます。@refill
一方、entity の message における位置を考えることもできます。@refill
entity はこの木における節となりますが、この木には深さと同じ深さの中の
順番に従って番号が付けることができます。即ち、
@example
┌───┐
│ nil │
└─┬─┘
┌─────────┼─────────┐
┌┴┐ ┌┴┐ ┌┴┐
│0│ │1│ │2│
└┬┘ └┬┘ └┬┘
│ ┌────┼────┐ │
┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐┌─┴─┐
│ 0.0││ 1.0││ 1.1││ 1.2││ 2.0│
└───┘└───┘└───┘└───┘└───┘
@end example
@noindent
のように深さ n の節には長さ n の整数列の節番号が振れます。これ
を @strong{entity-number} と呼びます。entity-number は S 式と
しては @code{(1 2 3)} のような整数のリストとして表現されます。
mime-entity では、これと同様の @strong{node-id} を用います。node-id はちょ
うど entity-number を逆にしたリストで、entity-number 1.2.3 に対応する
node-id は @code{(3 2 1)} です。@refill
前述のように、MIME message は entity を単位とした木構造になっているので、
この根である message 全体も mime-entity で表現することができ、buffer
local 変数 @code{mime-message-structure} に格納することにします。@refill
@code{mime-message-structure} を起点に entity-number や node-id
で示される entity を取り出すことができます。
@defvar mime-message-structure
現在の buffer における message 全体の mime-entity 構造体を格納するbuffer
local 変数。
@end defvar
@defun mime-entity-children entity
@var{entity} に含まれる entity の list を返す。
@end defun
@defun mime-entity-parent entity &optional message
@var{entity} の親の entity を返す。@refill
@var{message} が指定された場合、これを根と見倣す。
@end defun
@defun mime-root-entity-p entity
@var{entity} が根(即ち、message 全体)である場合に、非-@code{nil} を返
す。
@end defun
@defun mime-entity-node-id entity
@var{entity} の node-id を返す。
@end defun
@defun mime-entity-number entity
@var{entity} の entity-number を返す。
@end defun
@node Entity Search, Entity Attributes, Entity hierarchy, Entity
@section Entity の検索
@defun mime-find-entity-from-number entity-number &optional message
@var{message} から、@var{enity-number} の entity を返します。@refill
@var{message} が指定されていない場合は、
@code{mime-message-structrue} が使われます。
@end defun
@defun mime-find-entity-from-node-id entity-node-id &optional message
@var{message} から、@var{entity-node-id} の entity を返します。@refill
@var{message} が指定されていない場合は、
@code{mime-message-structure} が使われます。
@end defun
@defun mime-find-entity-from-content-id cid &optional message
@var{message} から、@var{cid} の entity を返します。@refill
@var{message} が指定されていない場合は、
@code{mime-message-structure} が使われます。
@end defun
@node Entity Attributes, Entity-header, Entity Search, Entity
@section Entity の属性
@defun mime-entity-content-type entity
@var{entity} の content-type を返す。(cf. @ref{mime-content-type})
@end defun
@defun mime-entity-content-disposition entity
@var{entity} の content-disposition を返す。
(cf. @ref{mime-content-disposition})
@end defun
@defun mime-entity-filename entity
@var{entity} の file 名を返す。
@end defun
@defun mime-entity-encoding entity &optional default-encoding
@var{entity} の content-transfer-encoding を返す。
(cf. @ref{Content-Transfer-Encoding}) @refill
もし、@var{entity} に Content-Transfer-Encoding 欄が存在しない場合は、
@var{default-encoding} を返す。これが指定されない場合は、@code{"7bit"}
を用いる。
@end defun
@defun mime-entity-cooked-p entity
@var{entity} の内容が既にコード変換されている場合は nil で無い値
を返す。
@end defun
@node Entity-header, entity formatting, Entity Attributes, Entity
@section Entity header の情報
@defun mime-fetch-field field-name &optional entity
@var{entity} の header 中の @var{field-name} 欄の body を返す。@refill
結果の文字列は network 表現のままである。@refill
@var{entity} が省略された場合は、@code{mime-message-structure} の値を用
いる。@refill
@var{field-name} 欄が存在しない場合は @code{nil} を返す。
@end defun
@defun mime-read-field field-name &optional entity
@var{entity} の header 中の @var{field-name} 欄を構文解析した結果を返す。
@refill
結果の形式は欄毎に異なる。非構造化欄の場合は文字列を返し、構造化欄の場合
はその形式に従った list を返す。@refill
結果中の文字列は Emacs の内部表現に変換される。@refill
@var{entity} が省略された場合は、@code{mime-message-structure} の値を用
いる。@refill
@var{field-name} 欄が存在しない場合は nil を返す。
@end defun
@node entity formatting, Entity-content, Entity-header, Entity
@section Entity の文字表現
@defun mime-insert-header entity &optional invisible-fields visible-fields
現在位置に @var{entity} の復号した header を挿入する。@refill
@var{invisible-fields} と @var{visible-fields} は正規表現のlist で、それ
ぞれ、表示したくない field 名と表示したい欄名を表現したものである。
@refill
@var{invisible-fields} の要素のどれかに match し、かつ、
@var{visible-fields} の要素のどれにも match しない欄は表示されない。
@refill
encoded-word (@ref{encoded-word}) は復号される。『生の非 us-ascii 文字』
は @code{default-mime-charset} として解釈される。
@end defun
@defun mime-insert-text-content entity
point の前に @var{entity} を text entity として挿入します。@refill
@var{entity} の内容は @ref{MIME charset} として復号化され
ます。@var{entity} の Content-Type field に charset paramter が無
いと、@code{default-mime-charset} が初期値として使われます。
@end defun
@defvar default-mime-charset
適切な MIME charset (@ref{MIME charset}) が見つからなかった場合に用いら
れるMIME charset.@refill
本来は APEL の変数である。
@end defvar
@node Entity-content, Entity-network-representation, entity formatting, Entity
@section Entity の内容
@defun mime-entity-content entity
@var{entity} の内容の byte 列を返す。
@end defun
@defun mime-insert-entity-content entity
point の位置に @var{entity} の内容を挿入します。
@end defun
@defun mime-write-entity-content entity filename
@var{entity} の内容を @var{filename} に書き込みます。
@end defun
@node Entity-network-representation, Entity buffer, Entity-content, Entity
@section Entity のネットワーク表現
@defun mime-insert-entity entity
@var{entity} の header と body を point のところに挿入します。
@end defun
@defun mime-write-entity entity filename
@var{entity} の表現を @var{filename} に書き込みます。
@end defun
@defun mime-write-entity-body entity filename
@var{entity} の body を @var{filename} に書き込みます。
@end defun
@node Entity buffer, mm-backend, Entity-network-representation, Entity
@section Entity の buffer による表現
@defun mime-entity-buffer entity
@var{entity} が存在する buffer を返す。
@end defun
@defun mime-entity-point-min entity
@var{entity} が存在する buffer における、@var{entity} が占める領域の先頭
位置を返す。
@end defun
@defun mime-entity-point-max entity
@var{entity} が存在する buffer における、@var{entity} が占める領域の末尾
位置を返す。
@end defun
@defun mime-entity-header-start entity
@var{entity} が存在する buffer における、header が占める領域の先頭位置を
返す。
@end defun
@defun mime-entity-header-end entity
@var{entity} が存在する buffer における、header が占める領域の末尾位置を
返す。
@end defun
@defun mime-entity-body-start entity
@var{entity} が存在する buffer における、body が占める領域の先頭位置を返
す。
@end defun
@defun mime-entity-body-end entity
@var{entity} が存在する buffer における、body が占める領域の末尾位置を返
す。
@end defun
@node mm-backend, , Entity buffer, Entity
@section Entity の表現と実現
@cindex mm-backend
@cindex entity 処理 method
@cindex representation-type
Entity は抽象化されたデータ表現で、実際のデータ表現としては用途に応じて
さまざまなものが利用できるように設計されています。@refill
ここで、entity がどういう種類の表現を行っているかを示すのが
@strong{representation-type} で、entity を生成する時にはこれを指定します。
(cf. @ref{Entity creation}) @refill
前節までに述べて来た entity に対する処理は、entity に対してその処理を依
頼することによって実現されています。Entity は自分の representation-type
を知っており、その representation-type に応じて実際の処理を行う関数を呼
び出します。このような関数を @strong{entity 処理method} と呼びます。また、
representation-type 毎にこのような関数をまとめたものを
@strong{mm-backend} と呼びます。@refill
mm-backend は representation-type の名前の先頭に @code{mm} という
接頭辞を付けた関数名からなる module で、その module 名は同様に
representation-type の名前の先頭に @code{mm} を付けたものになって
います。この module は representation-type の entity が最初に生成される
時に自動的に require されます。
@menu
* Request for entity:: Entity への便り
* mm-backend module:: mm-backend の作り方
@end menu
@node Request for entity, mm-backend module, mm-backend, mm-backend
@subsection Entity への便り
@defun mime-entity-send entity message &rest args
@var{entity} に @var{message} を送る。@refill
@var{args} は @var{message} の引数である。
@end defun
@node mm-backend module, , Request for entity, mm-backend
@subsection mm-backend の作り方
@defmac mm-define-backend type &optional parents
@var{type} を mm-backend として定義します。@refill
@var{PARENTS} が指定されている場合は、@var{type} は prents
を継承します。それぞれの parent は representation-type である必要があ
ります。
例:@refill
@lisp
(mm-define-backend chao (generic))
@end lisp
@end defmac
@defmac mm-define-method name args &rest body
@var{name} を (nth 1 (car @var{args})) backend の method 関
数として定義します。@refill
@var{args} は lambda の引数リストのようなものですが、(car
@var{args}) は指定された parameter である必要があります。(car
(car @var{args})) は変数の名前で、(nth 1 (car @var{args}))
は backend の名前 (representation-type) です。@refill
例:@refill
@lisp
(mm-define-method entity-cooked-p ((entity chao)) nil)
@end lisp
@end defmac
@node Content-Type, Content-Disposition, Entity, Top
@chapter Content-Type 欄の情報
@cindex mime-content-type
@cindex Content-Type 欄
@strong{Content-Type 欄} は media-type (@ref{media-type}) や MIME
charset といった entity (@ref{Entity}) の内容の種類や表現形式などを記述
するためのもので、RFC 2045 (@ref{RFC 2045}) で定義されています。
@noindent
@strong{[Memo]}
@quotation
歴史的には RFC 1049 で Content-Type 欄が提案されている。但し、MIME の
media-type のような type と subtype の区別はなく、MIME charset のような
文字符号の種類を表現することもできない。
@end quotation
FLIM は Content-Type 欄を構文解析する関数と Content-Type 欄の解析結果を
格納する構造体 @strong{mime-content-type} を提供します。
@menu
* Content-Type field:: Content-Type 欄の形式
* mime-content-type:: mime-content-type 構造体
* Content-Type parser:: Content-Type 欄の解析器
* Content-Type utility:: Content-Type に関する有用な関数
@end menu
@node Content-Type field, mime-content-type, Content-Type, Content-Type
@section Content-Type 欄の形式
@cindex parameter
@cindex subtype
@cindex type
Content-Type 欄の形式は以下のように定義されています:
@quotation
``Content-Type'' ``:'' @strong{type} ``/''
@strong{subtype} *( ``;'' @strong{parameter} )
@end quotation
例えば、
@quotation
@example
Content-Type: image/jpeg
@end example
@end quotation
@noindent
や
@quotation
@example
Content-Type: text/plain; charset=iso-2022-jp
@end example
@end quotation
@noindent
などのように用いられます。
ここで、`type' と `subtype' は entity の形式を示すもので、両者を総称し
て、`media-type' と呼ぶことにします。上記の例における `image/jpeg' や
`text/plain' は media-type の1つです。
@noindent
@strong{[Memo]}
@quotation
Content-Type 欄のない entity は
@quotation
@example
Content-Type: text/plain; charset=us-ascii
@end example
@end quotation
@noindent
として解釈される。(cf. @ref{us-ascii})
@end quotation
@node mime-content-type, Content-Type parser, Content-Type field, Content-Type
@section mime-content-type 構造体
@deffn{Structure} mime-content-type
Content-Type 欄の情報を格納するための構造体。@refill
この構造体を参照するには @code{mime-content-type-要素名} という名前の参
照関数を用いる。@refill
この構造体の要素は以下の通りである:
@table @var
@item primary-type
media-type の主型 (symbol).
@item subtype
media-type の副型 (symbol).
@item parameters
Content-Type 欄の parameter (連想 list).
@end table
@end deffn
@defun make-mime-content-type type subtype
&optional parameters
content-type の生成子。
@end defun
@defun mime-content-type-parameter content-type parameter
@var{content-type} の @var{parameter} の値を返す。
@end defun
@node Content-Type parser, Content-Type utility, mime-content-type, Content-Type
@section Content-Type 欄の解析器
@defun mime-parse-Content-Type string
@var{string} を content-type として解析した結果を返す。
@end defun
@defun mime-read-Content-Type
現在の buffer の Content-Type 欄を読み取り、解析した結果を返す。@refill
Content-Type 欄が存在しない場合は nil を返す。
@end defun
@node Content-Type utility, , Content-Type parser, Content-Type
@section Content-Type に関する有用な関数
@defun mime-type/subtype-string type &optional subtype
@var{type} と @var{subtype} から type/subtype 形式の文字列を返す。
@end defun
@node Content-Disposition, Content-Transfer-Encoding, Content-Type, Top
@chapter Content-Disposition 欄の情報
@cindex mime-content-disposition
@cindex RFC 2183
@cindex Standards Track
@cindex Content-Disposition 欄
@strong{Content-Disposition 欄} は entity の表示や file 名など
の属性になどに関する情報を記述するためのものです。
@noindent
[RFC 2183]
@quotation
S. Dorner, K. Moore and R. Troost, ``Communicating Presentation
Information in Internet Messages: The Content-Disposition Header'',
August 1997, Standards Track.
@end quotation
FLIM は Content-Disposition 欄を構文解析する関数と Content-Disposition
欄の解析結果を格納する構造体
@strong{mime-content-disposition} を提供します。
@menu
* mime-content-disposition:: mime-content-disposition 構造体
* Content-Disposition parser:: Content-Disposition 欄の解析器
@end menu
@node mime-content-disposition, Content-Disposition parser, Content-Disposition, Content-Disposition
@section mime-content-disposition 構造体
@deffn{Structure} mime-content-disposition
Content-Disposition 欄の解析結果を収めるための構造体。@refill
この構造体を参照するには @code{mime-content-disposition-要素名} という名
前の参照関数を用いる。@refill
この構造体の要素は以下の通りである:
@table @var
@item disposition-type
disposition-type (symbol).
@item parameters
Content-Disposition 欄の parameter (連想 list).
@end table
@end deffn
@defun mime-content-disposition-parameter content-disposition parameter
@var{content-disposition} の @var{parameter} の値を返す。
@end defun
@defun mime-content-disposition-filename content-disposition
@var{content-disposition} の filename の値を返す。
@end defun
@node Content-Disposition parser, , mime-content-disposition, Content-Disposition
@section Content-Disposition 欄の解析器
@defun mime-parse-Content-Disposition string
@var{string} を content-disposition として解析した結果を返す。
@end defun
@defun mime-read-Content-Disposition
現在の buffer の Content-Disposition 欄を読み取り、解析した結果を返す。
@refill
Content-Disposition 欄が存在しない場合は nil を返す。
@end defun
@node Content-Transfer-Encoding, encoded-word, Content-Disposition, Top
@chapter 符号化法
@cindex Content-Transfer-Encoding 欄
@strong{Content-Transfer-Encoding 欄} は entity の符号化法を記述するため
のものです。@refill
FLIM では Content-Transfer-Encoding 欄を構文解析する関数を提供します。こ
れらの関数は Content-Transfer-Encoding 欄の情報は文字列で表現します。
@refill
また、Content-Transfer-Encoding に基づいて符号化・復号化を行う関数も提
供されます。
@menu
* Content-Transfer-Encoding parser:: Content-Transfer-Encoding 欄の解析器
* encoder/decoder:: 符号化・復号化
* Encoding information:: Other utilities
* mel-backend:: How to write encoder/decoder module
* generic function for mel-backend:: How to add encoding/decoding service
@end menu
@node Content-Transfer-Encoding parser, encoder/decoder, Content-Transfer-Encoding, Content-Transfer-Encoding
@section Content-Transfer-Encoding 欄の解析器
@defun mime-parse-Content-Transfer-Encoding string
@var{string} を content-transfer-encoding として解析した結果を返す。
@end defun
@defun mime-read-Content-Transfer-Encoding &optional default-encoding
現在の buffer の Content-Transfer-Encoding 欄を読み取り、解析した結果を
返す。@refill
Content-Transfer-Encoding 欄が存在しない場合は@var{default-encoding} を
返す。
@end defun
@node encoder/decoder, Encoding information, Content-Transfer-Encoding parser, Content-Transfer-Encoding
@section 符号化・復号化
@defun mime-encode-region start end encoding
現在の buffer の @var{start} から @var{end} までの region を
@var{encoding} を使って符号化します。
@end defun
@defun mime-decode-region start end encoding
現在の buffer の @var{start} から @var{end} までの region を
@var{encoding} を使って復号化します。
@end defun
@defun mime-decode-string string encoding
@var{string} を @var{encoding} として復号した結果を返す。
@end defun
@defun mime-insert-encoded-file filename encoding
@var{ENCODING} format で符号化された file @var{FILENAME} を
挿入する。
@end defun
@defun mime-write-decoded-region start end filename encoding
@var{encoding} で符号化された現在の region を復号化して
@var{filename}に書き込みます。
<var>start<var> と @var{end} は buffer の位置です。
@end defun
@node Encoding information, mel-backend, encoder/decoder, Content-Transfer-Encoding
@section Other utilities
@defun mime-encoding-list &optional SERVICE
Content-Transfer-Encoding の list を返します。@refill
@var{service} が指定されていると、それに対する
Content-Transfer-Encoding を返します。
@end defun
@defun mime-encoding-alist &optional SERVICE
補完のための Content-Transfer-Encoding の表を返します。@refill
@var{service} が指定されている場合はそれに対する
Content-Transfer-Encoding の list を返します。
@end defun
@node mel-backend, generic function for mel-backend, Encoding information, Content-Transfer-Encoding
@section How to write encoder/decoder module
@defmac mel-define-method name args &rest body
@var{name} を (nth 1 (car (last @var{args}))) backend の
method 関数として定義します。
@var{args} は lambda の引数 list と似ていますが、(car (last
@var{args})) は指定された parameter である必要があります。(car
(car (last @var{args}))) は変数の名前で、(nth 1 (car (last
@var{args}))) は backend の名前 (encoding) です。@refill
例:@refill
@lisp
(mel-define-method mime-write-decoded-region (start end filename
(nil "base64"))
"Decode and write current region encoded by base64 into FILENAME.
START and END are buffer positions."
(interactive
(list (region-beginning) (region-end)
(read-file-name "Write decoded region to file: ")))
(let ((str (buffer-substring start end)))
(with-temp-buffer
(insert (decode-base64-string str))
(write-region-as-binary (point-min) (point-max) filename)
)))
@end lisp
@end defmac
@defmac mel-define-method-function spec function
@var{spec} の関数定義を @var{function} に設定します。@refill
@var{spec} の最初の要素は service です。@refill
@var{args} の残りは lambda の引数 list 似ていますが、(car (last
@var{args})) は指定された parameter である必要があります。(car
(car (last @var{args}))) は変数の名前で、(nth 1 (car (last
@var{args}))) は backend の名前 (encoding) です。@refill
例:@refill
@lisp
(mel-define-method-function (mime-encode-string string (nil "base64"))
'encode-base64-string)
@end lisp
@end defmac
@node generic function for mel-backend, , mel-backend, Content-Transfer-Encoding
@section 符号化/復号化 service を追加する方法
@defmac mel-define-service name &optional args doc-string
@var{name} を Content-Transfer-Encoding の service として定義しま
す。@refill
@var{args} が指定されていると、@var{name} は service の
generic function として定義されます。@refill
例:@refill
@lisp
(mel-define-service encoded-text-encode-string (string encoding)
"Encode STRING as encoded-text using ENCODING.
ENCODING must be string.")
@end lisp
@end defmac
@node encoded-word, custom, Content-Transfer-Encoding, Top
@chapter Header の network 表現
@cindex RFC 2047
@cindex Standards Track
@cindex RFC 2047
encoded-word は header で非 ASCII (@ref{ASCII}) 文字を表現するための形式
で、@strong{RFC 2047} で定義されています。@refill
@noindent
[RFC 2047]
@quotation
K. Moore, ``MIME (Multipurpose Internet Mail Extensions) Part Three:
Message Header Extensions for Non-ASCII Text'', November 1996, Standards
Track (obsolete RFC 1521,1522,1590).
@end quotation
また、行儀の悪いことだと言えますが、encoded-word を用いずに非 ASCII
(@ref{ASCII}) 文字を header に入れた記事も存在します。@refill
FLIM はこれらを符号化・復号化する機能を提供します。
@menu
* Header encoder/decoder:: Header の符号化・復号化
@end menu
@node Header encoder/decoder, , encoded-word, encoded-word
@section Header の符号化・復号化
@defun eword-decode-header &optional code-conversion separator
Header 中の encoded-word を復号する。@refill
もし @var{code-conversion} が @code{nil} なら、encoded-word だけが復号さ
れる。もし、@var{code-conversion} が MIME charset (@ref{MIME charset})
なら、非 ASCII bit patterns はその MIME charset として復号される。これ以
外の場合、非 ASCII bit patterns は@code{default-mime-charset}. として復
号される。(cf. @ref{entity formatting}) @refill
もし @var{separator} が @code{nil} でなければ、その値がheader separator
として用いられる。
@end defun
@defun eword-encode-header &optional code-conversion
Header を network 表現に符号化する。@refill
各 field は @code{mime-field-encoding-method-alist} で指定された方式で
符号化される。
@end defun
@defvar mime-field-encoding-method-alist
Field を符号化する方法を指定する連想 list。各 element は (FIELD
. METHOD) の様になっている。@refill
METHOD が @code{mime} であれば、FIELD は MIME format に符号化さ
れる (encoded-word)。
METHOD が @code{nil} であれば、FIELD は符号化されない。
METHOD が MIME charset であれば、FIELD はネットワークコードに変換しな
ければならないときに charset に符号化される。@refill
そうでなければ、FIELD はネットワークコードに変換しなければならないとき
に 変数 @code{default-mime-charset} で符号化される
@end defvar
@node custom, Appendix, encoded-word, Top
@chapter 一般設定
@deffn{group} mime
MIME 関連機能に関する group.@refill
@code{mail} と @code{news} に属する。
@end deffn
@node Appendix, Concept Index, custom, Top
@chapter 付録
@menu
* Glossary:: 用語
* Bug report:: bug 報告の仕方
* GitHub:: GitHub による開発
* History:: 歴史
@end menu
@node Glossary, Bug report, Appendix, Appendix
@section 用語
@menu
* 7bit::
* 8bit::
* ASCII::
* Base64::
* binary::
* Coded character set:: Coded character set(符号化文字集合), Character code(文字符号)
* media-type::
* message::
* MIME::
* MIME charset::
* MTA::
* MUA::
* Quoted-Printable::
* RFC 822::
* RFC 1036::
* RFC 2045::
* RFC 2046::
* RFC 2048::
* RFC 2049::
* plain text::
* us-ascii::
@end menu
@node 7bit, 8bit, Glossary, Glossary
@subsection 7bit
ここでは 0 から 127 の整数を指す。@refill
0 から 127 の整数の列で表現できるような data を ``7bit の data'' と呼ぶ。
@refill
また、0 から 31 および 127 で表現される制御文字と 32 で表現される空白と
33 から 126 で表現される図形文字からなる文字列のことを ``7bit の文字列''
と呼ぶ(これは ISO 2022 の「7 単位系」と同様)。
伝統的な Internet の MTA (@ref{MTA}) は 7bit の data を転送できるので、
7bit の data は Quoted-Printable (@ref{Quoted-Printable}) や Base64
(@ref{Base64}) といった変換を行わなくてもそのまま転送できる。@refill
しかし、7bit であればどんな data でも良いとはいえない。なぜなら、1行の
長さがあまりに長いと、MTA はその message を転送することができないからで
ある。ちなみに、RFC 822 (@ref{RFC 822}) は1行は改行文字を除いて 998
byte 以内であることを求めている。よって、これ以上の行が含まれる可能性の
ある data, 例えば、Postscript の data などは Quoted-Printable 等で
encodeする必用がある。
@node 8bit, ASCII, 7bit, Glossary
@subsection 8bit
@cindex binary
ここでは 0 から 255 の整数を指す。@refill
0 から 255 の整数の列で表現できるような data を ``8bit の data'' と呼ぶ。
@refill
また、0 から 31, 127 および 128 から 159 で表現される制御文字と 32 で表
現される空白と 33 から 126 と 160 から 255 で表現される図形文字からなる
文字列のことを ``8bit の文字列'' と呼ぶ(これは ISO 2022 の「8 単位系」と同様)。@refill
iso-8859-1 や euc-kr といった符号化文
字集合は 8bit の文字列である。@refill
伝統的な Internet の MTA (@ref{MTA}) は 7bit (@ref{7bit}) の data しか転
送できないので、そうした MTA を経由する場合、Quoted-Printable
(@ref{Quoted-Printable}) や Base64 (@ref{Base64}) といった変換を行わなく
てはならない。@refill
しかし、最近では 8bit の文字列をそのまま通すことができる MTA も登場して
きたので、そのまま送ることができる場合も増えてきた。@refill
しかし、8bit であればどんな data でも良いとはいえない。なぜなら、1行の
長さがあまりに長いと、MTA はその message を転送することができないからで
ある。ちなみに、RFC 822 (@ref{RFC 822}) は1行は改行文字を除いて 998
byte 以内であることを求めている。よって、これ以上の行が含まれる可能性の
ある data, 例えば、Postscript の data などは Quoted-Printable 等で
encodeする必用がある。@refill
また、こうした理由から、1行が 999 byte 以上の行が存在する可能性のある
data は @strong{binary} (@ref{binary}) と呼ぶことにする。@refill
ちなみに、7bit で表現できる data は 8bit でも表現できる。よって、
``8bit'' と言った場合、1行が 998 byte 以下の任意の data を指すことが
ある。
@node ASCII, Base64, 8bit, Glossary
@subsection ASCII
@cindex ANSI X3.4:1986
@cindex ASCII
アメリカ連邦で使われる文字を符号化した符号化文字集合 (@ref{Coded character set})。A-Z, a-z の Latin 文字と数字、幾つかの記号からなる。ISO 646 の一つ
で、現在は国際基準版 (IRV) になっている。
@noindent
[ASCII]
@quotation
``Coded Character Set -- 7-Bit American Standard Code for Information
Interchange'', ANSI X3.4:1986.
@end quotation
@node Base64, binary, ASCII, Glossary
@subsection Base64
@cindex pad
RFC 2045 (@ref{RFC 2045}) で定義されている MIME (@ref{MIME}) における
binary data (@ref{binary}) の network での変換法の1つ。@refill
『64 進数』という意味で、3 byte の data を 0 から 63 の数を表す ASCII
(@ref{ASCII}) 4 文字に変換する方法。(もし、4 文字にならなければ
@strong{pad} と呼ばれる詰め物をして長さを調整する)@refill
この 65 種類の文字は ASCII と EBCDIC の共通部分から選ばれており、
Internet 以外の network を経由する場合でも安全に転送できるように設計さ
れている。
@node binary, Coded character set, Base64, Glossary
@subsection binary
@cindex binary data
@cindex binary
任意の byte 列を @strong{binary} と呼ぶ。@refill
8bit (@ref{8bit}) と異なるのは data に行の構造を仮定しないことである。
また、行の構造があっても、999 byte 以上からなる行がある場合も binary と
呼ぶことにする。@refill
ちなみに、7bit (@ref{7bit}) や 8bit で表現できる data は binary でも表現
できる。よって、@strong{binary data} と言った場合、任意の data を指すこ
とがある。
@node Coded character set, media-type, binary, Glossary
@subsection Coded character set(符号化文字集合), Character code(文字符号)
文字と byte 列と1対1に対応付ける曖昧でない規則の集合。
@node media-type, message, Coded character set, Glossary
@subsection media-type
@cindex x-token
@cindex primary-type/subtype
@cindex message
@cindex multipart
@cindex application
@cindex video
@cindex audio
@cindex image
@cindex text
@cindex subtype
@cindex primary-type
MIME (@ref{MIME}) における entity (@ref{Entity}) の種類。
@strong{primary-type} と @strong{subtype} からなる。RFC 2046 (@ref{RFC 2046}) で定義されている。@refill
primary-type は標準では
@itemize @bullet
@item
@strong{text}
@item
@strong{image}
@item
@strong{audio}
@item
@strong{video}
@item
@strong{application}
@item
@strong{multipart}
@item
@strong{message}
@end itemize
@noindent
が定義され、それぞれには application/octet-stream, audio/basic,
image/jpeg, multipart/mixed, text/plain, video/mpeg などの
さまざまな subtype が定義されている。
@noindent
@strong{[注意]}
@quotation
ここでは、text/plain などの type/subtype の組をしばしば
@strong{primary-type/subtype} と書く。
@end quotation
media-type は、RFC 2046 で定義されているものに加えて、登録することもでき
る。現在、登録されているものは MEDIA TYPES
(ftp://ftp.isi.edu/in-notes/iana/assignments/media-types) で参照できる。
また、type もしくは subtype に、前に `x-' を付けた @strong{x-token} を用
いることにより、登録されていないものを私的に用いることもできる。しかし、
当然のことながら、こうした私的な media-type は諒解を得た者の間でしか解釈
できないので利用には注意すること。@refill
(cf. @ref{Content-Type})
@node message, MIME, media-type, Glossary
@subsection message
ここでは mail と news 記事の総称として用いる。
@node MIME, MIME charset, message, Glossary
@subsection MIME
@cindex Multipurpose Internet Mail Extensions
@strong{Multipurpose Internet Mail Extensions} の略で、Internet の mail
や news で us-ascii plain text (@ref{us-ascii}) 以外の文字を使うための
RFC 822 (@ref{RFC 822}) に対する拡張。@refill
RFC 2045 は冒頭で次のように述べている:@refill
STD 11, RFC 822 は、US-ASCII message header に関して非常に詳細に規定し
た message 表現 protocol を定義している。しかし、それは単に flat な
US-ASCII text のみに留まり、message の内容や message body に関する規定
はなされていない。Multipurpose Internet Mail Extensions, あるいは MIME
と総称される、この一連の文書は、以下の事を可能とするために message の
形式を再定義した:
@enumerate
@item
文書 message body における US-ASCII 以外の文字集合
@item
非文書 message body
@item
複数の部分からなる message body
@item
US-ASCII 以外の文字集合からなる文書 header 情報
@end enumerate
RFC 2045 (@ref{RFC 2045}), RFC 2046 (@ref{RFC 2046}), RFC 2047
(@ref{encoded-word}), RFC 2048 (@ref{RFC 2048}), RFC 2049 (@ref{RFC 2049}) で定義されている。
@node MIME charset, MTA, MIME, Glossary
@subsection MIME charset
Content-Type (@ref{Content-Type}) 欄や encoded-word (@ref{encoded-word})
の charset parameter で用いられる登録された符号化文字集合(@ref{Coded character set})。@refill
RFC 2045 (@ref{RFC 2045}) で定義されている。@refill
iso-2022-jp や euc-kr はその1つ。
@node MTA, MUA, MIME charset, Glossary
@subsection MTA
@cindex Message Transfer Agent
@strong{Message Transfer Agent} の略で、qmail や sendmail などの mail 配
送 program と inn などの news server の総称。@refill
(cf. @ref{MUA})
@node MUA, Quoted-Printable, MTA, Glossary
@subsection MUA
@cindex Message User Agent
@strong{Message User Agent} の略で、mail reader と news reader の総称。
@refill
(cf. @ref{MTA})
@node Quoted-Printable, RFC 822, MUA, Glossary
@subsection Quoted-Printable
RFC 2045 (@ref{RFC 2045}) で定義されている MIME (@ref{MIME}) における
binary data の network での変換法の1つ。@refill
`=' や制御文字や 128 以上の文字などは `=AF' のように `=' の後に続く 16
進数で表現する。このため、ASCII (@ref{ASCII}) 文字中心の data では
Base64 (@ref{Base64}) に比べると可読性が高くなる可能性がある。@refill
しかしながら、EBCDIC には存在しない文字を利用する場合、EBCDIC を利用し
ている network では安全に転送することができず、Base64 に比べて安全性は
低い。
@node RFC 822, RFC 1036, Quoted-Printable, Glossary
@subsection RFC 822
@cindex RFC 822
@cindex STD 11
@cindex Internet message
@cindex Internet mail
@cindex message header
Internet mail の主に @strong{message header} に関する形式に
関する標準を定めている RFC.
@noindent
@strong{[Memo]}
@quotation
news message もこれに準じているので、@strong{Internet mail} と書くよりも、
@strong{Internet message} と書いた方が良いかもしれない。
@end quotation
@noindent
[RFC 822]
@quotation
D. Crocker, ``Standard for the Format of ARPA Internet Text Messages'',
August 1982, STD 11.
@end quotation
@node RFC 1036, RFC 2045, RFC 822, Glossary
@subsection RFC 1036
@cindex RFC 1036
@cindex USENET
USENET での message の形式を定めた RFC. RFC 822 (@ref{RFC 822}) の
subset になっている。Internet の標準ではないが、USENET 以外の netnews で
もこれに準じているものが多い。
@noindent
[USENET: RFC 1036]
@quotation
M. Horton and R. Adams, ``Standard for Interchange of USENET Messages'',
December 1987, (obsolete RFC 850).
@end quotation
@node RFC 2045, RFC 2046, RFC 1036, Glossary
@subsection RFC 2045
@cindex RFC 2045
@cindex Standards Track
@noindent
[RFC 2045]
@quotation
N. Freed and N. Borenstein, ``Multipurpose Internet Mail Extensions
(MIME) Part One: Format of Internet Message Bodies'', November 1996,
Standards Track (obsolete RFC 1521, 1522, 1590).
@end quotation
@node RFC 2046, RFC 2048, RFC 2045, Glossary
@subsection RFC 2046
@cindex RFC 2046
@cindex Standards Track
@noindent
[RFC 2046]
@quotation
N. Freed and N. Borenstein, ``Multipurpose Internet Mail Extensions
(MIME) Part Two: Media Types'', November 1996, Standards Track (obsolete
RFC 1521, 1522, 1590).
@end quotation
@node RFC 2048, RFC 2049, RFC 2046, Glossary
@subsection RFC 2048
@cindex RFC 2048
@cindex Standards Track
@noindent
[RFC 2048]
@quotation
N. Freed, J. Klensin and J. Postel, ``Multipurpose Internet Mail
Extensions (MIME) Part Four: Registration Procedures'', November 1996,
Standards Track (obsolete RFC 1521, 1522, 1590).
@end quotation
@node RFC 2049, plain text, RFC 2048, Glossary
@subsection RFC 2049
@cindex RFC 2049
@cindex Standards Track
@noindent
[RFC 2049]
@quotation
N. Freed and N. Borenstein, ``Multipurpose Internet Mail Extensions
(MIME) Part Five: Conformance Criteria and Examples'', November 1996,
Standards Track (obsolete RFC 1521, 1522, 1590).
@end quotation
@node plain text, us-ascii, RFC 2049, Glossary
@subsection plain text
書体や組版に関する情報を持たない文字符号 (@ref{Coded character set}) のみ
で表現される text 情報。
@node us-ascii, , plain text, Glossary
@subsection us-ascii
@cindex ASCII
@cindex us-ascii
アメリカ連邦などで使われる英語などを表現するための MIME charset
(@ref{MIME charset}) の1つ。@refill
ASCII (@ref{ASCII}) のみからなり ISO 2022 による符号拡張は許されない。
Internet message における標準の符号化文字集合 (@ref{Coded character set})
であり、明示的に MIME charset が示されない場合は原則として
@strong{us-ascii} が使われる。@refill
また、RFC 822 (@ref{RFC 822}) における @strong{ASCII} は us-ascii である。
@node Bug report, GitHub, Glossary, Appendix
@section bug 報告の仕方
FLIM-LB に関する議論は以下のメーリングリストで行われます。
最新バージョンのアナウンスもこちらに流れます。
@display
Wanderlust Mailing List @t{<wl@@ml.gentei.org>}
@end display
ここでは主に日本語での議論が行われています。また、英語専用のリストとして
@display
Wanderlust List in English @t{<wl-en@@ml.gentei.org>}
@end display
もあります(こちらに投稿されたメッセージは前者にも配送されます)。
これらのメーリングリストのガイドを得るには、@t{wl-ctl@@ml.gentei.org} 宛
(英語の方は @t{wl-en-ctl@@ml.gentei.org} 宛) で、本文に
@example
# guide
@end example
@noindent
と書いたメールを送って下さい。
バグ報告やパッチの送付もこれらのメーリングリストへ送ってください。メーリ
ングリストへの送信はメンバになる必要があります。
但し、あまりにも古い版に関する報告は歓迎されません。古い版の bug は、新
しい版では治っているかもしれません。まず、最新版で確認してみましょう。
@refill
それから、適切な報告をしましょう。単に「うまく動かない」と言われてもど
ういう状況なのかはさっぱり判りません。最低限、OS, emacs, APEL, FLIM,
SEMI, 使っている MUA の種類および版、設定を書く必要があります。また、
error が起っている場合は backtrace を送ることも重要です。
(cf. @ref{Bugs,Reporting Bugs ,Reporting Bugs, emacs, GNU Emacs
Manual})
また、bug は大抵複数の人が遭遇するものです(そうでなければ、bug ではな
い可能性があります)。だから、作者に直接 mail を送ると作者は同じ mail
を何通も書く羽目になります。だから、必ず bug 報告は上記の address に送っ
てください。
@node GitHub, History, Bug report, Appendix
@section GitHub による開発
FLIM-LB のリポジトリは GitHub で公開されています。
@example
@uref{https://github.com/wanderlust/flim}
@end example
プルリクエストを送る場合は、Emacs の様に、コミットメッセージに従来の
@file{ChangeLog} エントリに相当する内容をインデントせずに入力して下さい。
Emacs の @file{CONTRIBUTE} ファイル
@footnote{@uref{https://git.savannah.gnu.org/cgit/emacs.git/plain/CONTRIBUTE}}
にある @cite{Commit messages} セクションを参照して下さい。
また、バグ報告の場合はバックトレースを取って添付すると原因究明しやすくな
ります。 @footnote{バックトレースの取り方は
@uref{http://www.jpl.org/elips/BUGS-ja.html}が参考になります。}
@node History, , GitHub, Appendix
@section 歴史
FLIM の code の最古の部分は 榎並 嗣智 氏が書いた @file{mime.el} に起源し
ます。この小さな program は Nemacs で動作する iso-2022-jp の B-encoding
専用の encoded-word の復号化プログラムでした。@refill
その後、守岡 知彦 は @file{mime.el} を元に@file{tiny-mime.el} というプロ
グラムを書きます。これは、Nemacs と Mule で動作する encoded-word の符号
化・復号化プログラムでした。@file{tiny-mime.el} は B-encoding だけでなく
Q-encoding もsupport し、また、MULE で扱うことができるさまざまな MIME
charset (@ref{MIME charset}) を同時に使うことができました。この時、
Nemacs と Mule の双方を support するために用いられたテクニックは後に emu
package にまとめられます。@refill
この頃、守岡 知彦 は @file{tiny-mime.el} をさまざまな MUA で使うための設
定集も配布していましたが、それらは後に@file{tiny-mime.el} とともに1つの
package にまとめられ、tm という名前で配布されます。@refill
守岡 知彦 はやがて、MIME message を閲覧するためのプログラムである
@file{tm-body.el} を書きます。これは、すぐに@file{tm-view.el} という名前
に変わりましたが、やがて、これが@file{tiny-mime.el} に代わって、tm の中
核となります。@refill
@file{tm-view.el} は当然、Content-Transfer-Encoding を扱う必要があります。
この目的のために、MEL が整備されはじめました。Base64 に関しては
@file{tiny-mime.el} の code が移され、また、新たにQuoted-Printable の
code が追加されました。これらが@file{mel-b.el} と @file{mel-q.el} になり
ました。@refill
また、後に、守岡 知彦 によって uuencode 用の @file{mel-u.el} が追加され、
その後に、小林 修平 氏によって x-gzip64 用の@file{mel-g.el} が追加されま
した。@refill
tm では後に、守岡 知彦 によって @file{tiny-mime.el} の再実装が行われ、こ
の過程で、STD 11 の parser が書かれました。これは、現在の
@file{std11.el} に当たります。また、この過程で @file{tiny-mime.el} は復
号化を行う @file{tm-ew-d.el} と符号化を行う @file{tm-ew-e.el} に分けられ
ました。この両者が現在の @file{eword-decode.el} と
@file{eword-encode.el} の先祖に当たります。@refill
後に、守岡 知彦 らによって tm の全面書き換え作業が行われ、この過程で、tm
は APEL, MEL, SEMI, EMH, RMAIL-MIME, Gnus-MIME などに分けられました。こ
のうちの MEL が FLIM の直接の先祖に当たります。@refill
後に、APEL から @file{std11.el} が移され、また、@file{mailcap.el},
@file{eword-decode.el} および @file{eword-encode.el} が SEMI から移され、
package の名前が FLIM となります。@refill
この直前から田中 哲 氏がより RFC に忠実な実装を書き始め、これは、現在、
FLIM の枝である ``FLIM-FLAM'' となっています。
@node Concept Index, Function Index, Appendix, Top
@chapter 概念索引
@printindex cp
@node Function Index, Variable Index, Concept Index, Top
@chapter 関数索引
@printindex fn
@node Variable Index, , Function Index, Top
@chapter 変数索引
@printindex vr
@bye