WiLiKi:文字エンコーディング
発端
現在のWiLiKi (0.2, 2002/12/18) では、文字エンコーディングに関して 二つの問題がある。
- 日本語メッセージカタログmsgs.jpがeuc-jp決め打ちなので、 euc-jpがネイティブでないgoshだと動かない。
- urlに日本語文字列が渡された時の挙動がおかしい。
ukaiさんパッチ (2002/12/21)
ukai: はじめまして。 とりあえずいろいろためしてみてだいたい動くようになったのでpatchをつくってみました。scheme初心者なのでへんなことしてるかもしれませんが。
- :charsets というのを追加しました。これは出力ページの charset の assoc で、make <wiliki> する時に '((jp . euc-jp) (en . euc-jp)) などのようにします。この値にしたがってces-convertしています。wikinameもces-convertしたのちにuri-encodeしています。euc-jp以外にもutf-8とかiso-2022-jpでもいけるはず? なお、enもeuc-jpのようにしないと ->Englishのページをみにいくと、invalid character sequence in the input stream で死にます。
- wiliki.cgi?ページ名 だと cgi-get-parameter の中の assoc で cannot compare incomplete vs complete string をくらって死亡することがあるので常に p= をつけるようにしました。
- 上の状況で死ぬときはwilikiが#fのままなので (style-sheet-of (wiliki)) できなくて死んでさっぱり状況がわからないので wilikiが#fかどうかみるようにしてみました。
- uri-encodeがread-charしてやっていますが、utf-8の時に結果があやしいので、ここはread-byteしたほうがいいと思います。uri.scm.patch
- msgs.jpはgauche-character-encodingにあわせてインストールしておきます。 (2002/12/21 04:32:05 JST)
Shiro (2002/12/21 04:31:16 PST): ども。パッチ頂きました。
- :charsetsの追加は良いアイディアだと思います。
- ukai: encodingの変換はhtml-pageでやるようなpatchにしましたが、cgi-mainとかに指定しておくとcharsetの追加とencodingの変換を勝手にやってくれるようになっていると便利なんじゃないかと思うんですがどうでしょう? (2002/12/22 02:37:12 PST)
- wiliki.cgi?ページ名 はそのシンプルさからなんとか残したいなあ。 渡された言語さえも分からない状態ではエンコーディングの推測のしようも無いので 無理といえば無理なんですが、そこはデフォルト言語で解釈するとかして… www.cgiの方でパラメータの受渡し方法が決め打ちなのがまずいかも。 実は最近、cgiファイル以下のパス名でアクセスしたいシステムを作って、 やっぱりcgi-mainが使えなかったという経験があるので。
他にアイディアを思い付いたら書き足して行きます。
yaegashi: はじめまして。 上記の ukai さんのパッチを組みこんだ Debian パッケージを作成しました。 詳細は keshi:WiLiKi をごらんください。 ここでこのパッチの動作のチェックができます。 (2002/12/21 04:28:28 PST)
Shiro: 早っ。確認させてもらいます。
'wiliki.cgi?ページ名' への対応
Shiro: 「ページ名」のエンコーディングがgoshのネイティブエンコーディングと 異なると、cgi-get-parameterがエラーになる場合がある。 ukaiさんパッチでは必ずp=を付けるようにして回避しているが、 本来の問題はwww.cgi側にある。
- 現在、変換ルーチンはパラメータの値のみに適用可能だが、
パラメータ名の変換ルーチンも指定できるようにしておけば良いか?
- ukai: そもそもequal?でcannot compare incomplete vs complete stringがerrorをsignalせずに、どうせ違うのだから#fをかえしてくれればいいと思うのですが、それでは問題があるでしょうか? (2002/12/22 02:37:12 PST)
- Shiro: それもそうだ。何でエラーにしたんだっけ…とコードを見直してみたらば、 比較対象が文字列の場合equal? は汎用文字列比較ルーチンに仕事を振っていて、 その比較ルーチンはstring=?だけでなくstring<?等にも使われるものなので 引数に半順序関係が定義できることを前提としているからなのでした。 等価性の判定だけをするフラグを付けたらよさそうです。
WiLiKi 0.3での対応
Shiro: 2003/02/08 19:53:05 PST現在、0.3リリースへ向けたテストに入っています。
- 表示とURLに使われる外部エンコーディングと、Gaucheの内部エンコーディングを 切り離しました。外部エンコーディングは :charsets で言語ごとに指定できます。 (日本語EUC-JP, 英語UTF-8も可能です。但し内部データから外部データに 変換可能でなければならないので、英語をiso-8859-1にしておくと、 日本語が含まれているページでエラーになります。noneにすると 変換無しでスルーするはず。)
- 出力時の変換はGauche-0.6.7.1のwww.cgiの新機能を使っています。 従って0.6.7.1以降を必要とします。
- 'wiliki.cgi?ページ名' の問題も、0.6.7.1のstring=?のフィックスに伴い 解決されています。
- メッセージカタログはインストール時にGaucheの内部エンコーディングに 変換するようにしてます。