前述したように、フォームに入力された情報は、formタグのactionアトリビュートで指定したURIに送られます。URIにmailto形式を使うことでメールを特定のアドレスに送ることもありますが、CGIプログラムのURIを指定して適切な処理を行うのが普通です。CGIプログラムで標準出力に出力したコンテンツがブラウザに送られます。
CGIを経由してデータを送る際には、一部の文字はURIの仕様に従ってエンコーディングされます。
日本語の文字コードには、EUC-JP、JIS、ShiftJISの3種類がありますが、どの文字コードが使われるかは、ブラウザによるようです。Netscape Navigator/Communicatorではフォームの送信元のファイルの文字コードと同じものが使われます。Lynxではファイルの文字コードに関係なく、すべてEUC-JPが使われます。このため、受けたデータに日本語が入っている可能性があるなら、CGIプログラム側で特定の文字コードに変換する必要があるでしょう。
エンコードしたデータは、formタグのmethodアトリビュートの値がgetのときには、環境変数QUERY_STRINGに入ります。postのときには、標準入力に入り、環境変数CONTENT_LENGTHにその大きさがバイト単位で入ります。
CGIプログラムにはPerlが多く使われます32。Perlは、テキストの入力データを加工し出力することを得意としています。CGIプログラムの役目はまさにこれです。PerlはUNIX用の言語実行環境ですが、WindowsやMacintoshにも移植されています。Perlにはさまざまな追加モジュールが提供されていますが、CGIの処理を簡単にするものもいろいろ用意されています。本ドキュメントではCGI.pmというモジュールを使うことにします。Perlの細かな言語仕様などについてはここでは紹介しません。
次のPerlスクリプトは、フォームのページで記載したnameとemailの変数の値を表示するCGIプログラムです。行番号は説明のための便宜的なものなので、実際のプログラムスクリプトには入っていません。このスクリプトはUNIX用のものですが、Windowsでも同様に動作するでしょう。UNIXの場合には、chmod a+x ファイル名を実行して、実行属性を付ける必要があります。
1:#!/usr/bin/perl
2:use CGI;
3:$query = new CGI;
4:print <<EOF
5:Content-type:text/html
6:
7:<html>
8: <head>
9: <title>送信結果</title>
10: </head>
11: <body>
12: <h1>送信結果</h1>
13: <ul>
14:EOF
15: ;
16:
17:print " <li>" . $query->param('name') . "</li>\n";
18:print " <li>" . $query->param('email') . "</li>\n";
19:
20:print <<EOF
21: </ul>
22: </body>
23:</html>
24:EOF
25: ;
CGI.pmは、エンコーディングされたデータを復元するため、処理する際にエンコードを気にする必要はありません。ちなみに次のようなPerlスクリプトでも復元することが可能です。
s/\+/ /g;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
変数の値に日本語文字コードが含まれるときには、文字コードをCGIプログラムで扱いやすいものに統一する必要があるでしょう。UNIXであればEUC-JP、WindowsであればShiftJISに統一することになるでしょう。Perlでは、jcode.plというライブラリファイルがよく使われているようです。
Webサーバーによっては、CGIプログラムは特定のディレクトリ下にあるときのみ使用可能になっていることがあります。
CGIプログラムに渡される環境変数の代表的なものとして、次のようなものがあります。Webサーバーの種類や設定によってほかにも渡されることがあります。