DeleGateに内蔵されている、入力テキストの文字コードを変換して出力する機能と、 MIMEのエンコーディングを変換する機能の使用方法について説明する。
歴史的に日本語の文字を表現する文字セットは一種類だけだったが、これを 7ビットあるいは8ビットのバイト列にして、日本語テキストを表現するための形式 (文字コード形式)が3種類併存して来た。 さらにその後別の文字セットとして日本語文字を含むUnicodeが加わり、現在では 4種類の文字コードが使われている。 日本語テキストを処理・表示するプログラムによっては、これらの文字コードの うちのいずれかを扱えないものがある。そのような場合に対処するために、 テキストデータを中継するプロキシや外部プログラムによって、文字コードを 変換してやることが必要になる。
DeleGate を(プロキシ)サーバとして使用して、テキストデータを中継する際に、 そのデータの日本語コードを変換することができる。この変換が適用可能な プロトコルは、HTTP, SMTP, POP, NNTP, FTP, Telnet, Tcprelay である。 一方、DeleGateをオフラインコマンドとして使用して、入力ファイルの日本語 コードを変換するオプションとして、-Fccx がある。また、MIMEコード変換を 行う際に併せて文字コード変換を行う -FdeMime がある。 これらのプロトコルやオプションに共通して、 以下に述べる方法で文字コードの変換を行うことができる。
インターネット上で交わされるメールの形式はMIMEメッセージと呼ばれ、Subject, From, Content-Type などのヘッダと、ボディ(本文)からなる。 (マルチパート形式のMIMEメッセージでは、ボディ中にさらに複数のヘッダとボディが 包含されている)。 MIMEメッセージは、ネット上で交換される際にはMIME規格に従ってエンコード された表現形式をとり、メイル読み書きのためのプログラムで処理する際には 内部での処理に即した形式で表現される。 以下、前者を外部形式、後者を内部形式と呼ぶ。 また、外部形式から内部形式への変換を「MIMEデコード」、逆に内部形式から外部 形式への変換を「MIMEエンコード」と呼ぶ。
外部形式のためのMIMEエンコーディングとしては、ヘッダ中に日本語文字 (非ASCII文字)を表現するための形式と、ボディ中のバイナリ転送用の コーディング(BASE64あるいはQuoted-Printable)が含まれる。 ヘッダのエンコーディングは非ASCII文字をASCII文字にエンコードするための ものであり、ボディのエンコーディングは8bitデータを7bitの表示可能ASCII 文字にエンコードするものである。 DeleGateのMIMEコード変換では、これらヘッダやボディのコーディングの変換 を行う。
DeleGate を(プロキシ)サーバとして使用して、インターネットメール形式の メッセージデータを使用するプロトコル(SMTP, POP, および NNTP) を中継する 際には、そのメッセージの MIME コードを変換する。 この場合、サーバへの送信は外部形式への変換(MIMEエンコード)、サーバからの 受信(クライアントへの中継)では内部形式への変換(MIMEデコード)を行う。 一方、DeleGateをオフラインコマンドとして使用して、入力ファイルのMIME コーディングを変換するオプションとして、-FdeMime と -FenMime がある。
入力側の文字コードは自動的に認識(推定)される。 出力側の文字コードを指定するのが CHARSET パラメタで、以下のように指定する。
CHARSET=[a-][r-][r+][文字コード名]
例: CHARSET=a-r-EUC-JP |
|
|
文字コード変換がMIMEメッセージやHTTPメッセージに適用された場合、そのボディ のテキストの文字コードが変換されるとともに、ヘッダ中のContent-Typeに指示され ている文字コードパラメタ(charsetパラメタ)の値として、CHARSETに指示された 文字コード名が指示される。
CHARSET=guess は、HTTPヘッダ中のContent-Typeに(charsetパラメタで)
文字セット名が指示されていない場合にのみ意味を持ち、
入力テキストから推定した文字コード名をそこに出力する。
(例: Content-Type: text/html → Content-Type: text/plain; charset=EUC-JP)
最近のウェブブラウザは「日本語版」でなくても、各種日本語コードを解釈・表示
することができる。ただそのためには、charsetパラメタに文字コード名が明示
されている必要がある。しかし、日本語テキストを提供するサーバ側では、
charsetパラメタを設定していない場合が少なくない。そのような場合に対処する
ために、クライアント側のプロキシサーバやサーバ側のゲートウェィサーバ
(リバースプロキシ) において、この CHARSET=guess を使用する。
DeleGateがプロキシサーバとしてMIMEメッセージを中継する時、 日本語文字コードを含むテキストがDeleGateからサーバを経由して外部に送信 される場合には、その表現形式は適切な外部表現にエンコードされている必要が あるため、この場合はMIMEエンコードがデフォルトで適用される。 一方、サーバから受信したMIMEメッセージをクライアントに中継する際に、 内部表現に変換する必要性があるか否かは状況によって異なるので、この場合の MIMEデコードは明示的に指定された場合にだけ行われる。
... 変換機能一覧 ...
MIMEエンコード、MIMEデコードを制御するためには、MIMECONVパラメタを指定する。
MIMECONV={thru|charcode}
|
|
|
これまで10年間のDeleGateの開発を通じて、DeleGateの文字コード変換やMIME変換 機能をまとめたドキュメントをこれまで書いたことがない。 これはただのサボりでもなく、特に文字コード変換機能については極めて短い期間 に過渡的にしか必要とされないだろうと考えていたことにもよる。 実際、最近ではすっかり、各種文字コード変換機能やMIME変換機能は 各種プログラムに組み込みとなって、外部で変換してやる必要があることは多くは 少なくなった。
ところが最近になって、私自身がとある全文検索エンジン(既に数年前に開発 が終了している)の前処理のためにこれを使う必要が起こり、機能の拡張が 必要になった。 そこで、上記の CHARSET の a- や r- という機能を今回の版(DeleGate/8.9.5)に 追加したのを機に、この文書をまとめた。