こんにちは、山本です。
ActiveStateが公開しているActiveTcl 8.3.4.2にはhttpパッケージの
バージョン2.4が同梱されています。
このバージョンでは、Content-typeがテキストのときはcharsetの値を
見てエンコーディング方法を変更するように作り込まれていますが、
残念ながら意図した通りのエンコーディング結果を得ることができません。
例えば、旧Tcl/Tk MLで藤岡さんが http://www.ruby-lang.org/ja/ への
アクセスに挑戦していますが、ここはcharset=iso-2022-jpで送られてきます。
set id [::http::geturl http://www.ruby-lang.org/ja/]
puts [::http::data $id]
しかし、Tclには「iso-2022-jp」という名称のエンコーディングが存在
しないため、その結果は文字化けしてしまいます。これは、Tclのライブラリに
入っているエンコーディングの名称が「iso2022-jp」であるからです。
つまり、Tclのエンコーディング名は、IANAに登録されているcharacter sets
(http://www.iana.org/assignments/character-sets)と異なるため、これらを
マッピングしてやる必要があります。
で、私が思いついた方法は以下の3通りです。
(1)encodingシステムを拡張して、encoding名のaliasを定義できるようにする
(2)lib/tcl8.3/encoding/の中にIANA character setsのencファイルを作る
(3)encodingコマンドとfconfigureコマンドをオーバーライドする
すぐに作業できそうなのは(2)と(3)ですが、(2)はTclのライブラリに手を入れる
ことになりますから、複数のマシンに展開するときは面倒そうです。
と、いうわけで、とりあえず(3)の方法で対処してみようかと考えています。
# 本当は(1)にチャレンジしてみたいという気もありますけど...
--
Koichi Yamamoto,
http://www3.ocn.ne.jp/~yamako/