広い世間には、同じことでお悩みの方がきっといらっしゃると思うので、ご参考までに書いておきます。

フォームを使ってCGIなどのプログラムにデータを渡したい場合ってありますよね。 たとえば検索窓。 検索ワードをデータとして検索エンジンに渡さなくてはなりません。

でもまあ、このこと自体はそんなに難しいことではありません。 検索エンジンはたいてい、自分のところの検索窓を取り付けてもらうのは大歓迎ですから、 どこかにそのソースと貼り付け方が書いてあります。 googleyahooなど 大手の検索エンジンともなると、 様々な文字コードをサポートしており、その指定方法まで書いてあったりなんかして。 もう、至れり尽くせりです。

けれども世の中には、自分のところの検索窓を取り付けたい人がいるだなんて 夢にも思わないマイナーもしくはローカルな検索エンジンもたくさんあるんですよね。 そういうところは、使える文字コードが決まっていたりします。

それでも、こちらが先方のご要望に合った文字コードを自由に選択して渡せれば問題はありません。 実際、そういうときのために、form(フォーム)タグには、文字コードを指定する属性があります。 たとえばこんな感じです:

<form action="起動したいプログラムのURL名" accept-charset="Shift_JIS">

これは要するに、「入力フィールドに打ち込まれた文字列を、Shift_JISで送信してください」と ブラウザにお願いしているわけですね。 Shift_JISの代わりに、UTF-8EUC-JPを 指定することもできます。 そして、firefoxなど、聞き分けのよいブラウザなら、このお願いを二つ返事で引き受けてくれます。

ところが‥! なんと、大メジャーInternet Explorer(IE)の聞き分けが悪いんです。 こっちがこんなに可愛らしくお願いしているのに、 なんとこのお願いを無視しやがるのです!! そして勝手に、そのソースが書かれた文字コードのデータを先方に送りつけてしまうのです。

まったくこれには困ったものです。 先方のプログラムが所望する文字コードがソースの文字コードと異なる場合は、 どうすればよいのでしょう?

今回わたしが出合ったのも、そういうケースでした。 図書館の蔵書検索窓を、ホームページにしているローカルのhtmlに設置したかったのです。 htmlのソースはWindowsのメモ帳で書いているからもちろんShift_JISです。 でも先方はEUC-JPを要求してくる。 ああ、一体どうしたら‥?

先方に合わせてEUC-JPでソースを書く? ――いいえ、それはできません。 だって、そのhtmlファイルには、Shift_JISのデータを欲しがる別の検索窓をすでに取り付けてあるんですもの。

あいだにCGIを噛ませて文字コードを変換する? ――ウーン、検索窓一つのために、そこまでやりたくはありません。

これには本当に困ってしまいました。 それで、誰かに解決策を教えてもらおうと検索をかけてみたのですが、 案外こういうのの解決法ってないものなんですねえ‥。

本当は一つだけ見つかったのですけれどね。なんと、 サブミットの瞬間だけページ全体の charset の指定を入れ替えるWeb検索!メタサーチ) という‥。 この方法にはもう、ビ〜クリ!! Javascriptを使って一瞬だけ文字コードを書き換えてしまうという、アクロバット技というか力技というか‥。 うーん、素晴らしい!! ――ただ、この方法にも問題があって、 ブラウザの戻るボタンを押した場合に、元のページが文字化けを起こしてしまうようです。

あー、困った。 諦めるしかないんだろうか?

‥でも、そうこうしているうちに、ふと閃いたのです。 文字コードが気に入らなければ、そこだけ別ページにしてしまえばいいじゃないか、と。

その方法はこうです。

  1. 送信したいコードにて、フォーム部分を別ファイルに作成
  2. インラインフレームとして、表示したいページに別ファイルを取り込む

こうすれば、一つのページにいくつでも、それぞれに違ったコードでデータを送信するフォームを 並べることができるではないですか!

テキストエディタは、手持ちの Tera Padを使うことにしました。 これだとShift_JIS、EUC-JP、UTF-8など5つの主要な文字コードから選択してソースが作成できるようです。 こんなエディタが無料で公開されているなんて、なんて有り難いんでしょう! これを使って、ここではlibrary.htmlという埋め込み用のファイルを作成しました。

その別ファイルlibrary.htmlのソースは以下のような感じです。 (ここではキーポイント以外、はしょっていますので、正確には、実際のソースをご覧ください):

<html>
<head>
   <title>図書館蔵書検索</title>
   <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
   <form name="search" action="呼び出すプログラムのURL" method="POST" target="_top">
      <input type="text" name="key" size="40"> <!-- 検索ワード入力エリア -->
      <input type="submit" value="検索"> <!-- 送信ボタン -->
   </form>
</body>
</html>

間違えやすい部分、重要な点を赤字にしてみました。 以下の3点がポイントでしょうか。

  1. metaタグでcharsetを正しく指定すること。
  2. 呼び出すプログラムのURLを正しく指定すること。
  3. formタグのtarget属性に_topを指定すること。

これを貼り付けたいファイルのソース部分は以下のような感じです:

<iframe src="./library.html" width="" height="高さ" scrolling="no" frameborder="0" marginwidth="0" marginheight="0"></iframe>

ここでのチェック項目は以下の2点です。

  1. フォーム部分を記載した別ファイルへのパスを正確に記入すること。
  2. 適切な幅、高さを指定する(最初は大きめに指定し、様子を見ながら縮めるとよい)。

こうして出来上がったのが、以下の検索窓です。

横浜図書館

ここにあるのはダミーなので、検索以外のボタンは正常に作動しませんが、 ローカルに置いてある本物には自分のIDやパスワードをソースの中に埋め込み、 予約状況・貸出状況がワンクリックで調べられるようにしました。

この図書館の検索窓を アマゾンの検索窓と並べておくと、すご〜く便利! なぜってわたしは次のような手順で本を探すことが多いからです。

  1. どこかで本の評判を聞きつける。
  2. amazonで、その本の詳細およびカスタマーレビューをチェックする。
  3. 良さそうなら図書館で探して予約を入れる。
  4. 読んでみて本当に気に入ったら購入する。

図書館の蔵書検索窓の導入により、この流れがよりスムーズになりました。 手間はかかりましたが、満足です^^。

初稿:2005年12月24日

index