モバイルCGI研究(J-SKY編)
|
2001年11月5日更新 |
J-SKY 用のページは HTML で書くことができますが、 J-SKY 独自の仕様になっている部分も多く、意外とつまづくことがあります。このページでは CGI に関わる入力フォーム周りの注意点を説明します。
説明の中には、機種に依存した項目もいくつかあるかと思います。また、 J-SKY 用 HTML はそもそもゲートウェイサーバにて MML (Mobile Markup Language) という言語に変換しており、たまにその変換方法の仕様が変更されるようなので、ここに書かれた記事が現在も正しいという確証は得られません。まだ謎に包まれた箇所も多いので、みなさまから情報をお寄せいただけると助かります。
J-SKY 端末には ステーション対応端末と非対応端末が存在します。ステーション対応端末では POST メソッドも GET メソッドも使えますが、非対応端末だと GET メソッドしか使うことができません。
ステーション対応端末と非対応端末を区別するには、環境変数 "HTTP_USER_AGENT" を使います。環境変数 "HTTP_USER_AGENT" は "J-PHONE/ブラウザバージョン/端末名" というフォーマットになっていて、ブラウザバージョンが "3.0" ならば、ステーション対応端末、 "2.0" ならば非対応端末という事になります。
HTTP_USER_AGENT(例) | ブラウザバージョン | ステーション | method |
J-PHONE/3.0/J-SH07 | 3.0 | 対応 | POST/GET |
J-PHONE/2.0/J-SH02 | 2.0 | 非対応 | GET |
ステーション対応端末と非対応端末で <form> タグの method プロパティを書き分けたい場合は、次のようにすればいいでしょう。
Perl # ステーション対応端末と非対応端末の判別 @user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'}); if ($user_agent[1] >= 3) { # ステーション対応端末 print "<form action=\"xxxx.cgi\" method=\"post\">"; } else { # それ以外 print "<form action=\"xxxx.cgi\" method=\"get\">"; }
method プロパティを省略した場合は GET とみなされるそうなので、パケット代を少しでも浮かせたい場合は書かないのも手でしょう。
他にもステーション対応端末と非対応端末で異なる点がいくつかあります。興味がある方は J-Phone のサイトで確認してください。
<input> タグの mode プロパティで、テキスト入力の際のデフォルトの入力モードを指定することができます。
mode プロパティの値 | 入力モード |
hiragana | 全角ひらがな(漢字) |
katakana | 全角カタカナ |
alphabet | 英字・記号(数字は除く) |
numeric | 数字 |
html
(使用例)
<input type="text" mode="numeric">
<input> タグの maxlength プロパティの値は最高で 64 まで設定することができます。指定しない場合はデフォルトの 28 になります。
ただし、この値は URL エンコード後のバイト数を制限しているようなので注意が必要です。例えば、 "cgiponmobilecgi@specters.net" というメールアドレスは 28 文字ですが、 URL エンコードすると "cgiponmobilecgi%40specters.net" と 30 バイトなるため、デフォルト 28 文字のままでは入力できないことになります。
"uid" や "sid" などの変数名は予約されているらしく、 <input> タグの name プロパティの値として使うことができません。とりあえず "*id" という名前の変数名は使わない方が無難でしょう。
入力フォームで入力された値は "name1=value1&name2=value2" というように、 "変数名=値" のペアが "&" で区切られて CGI に渡されますが、いくつか注意点があります。
まず変数名の方ですが、ハイフン "-" やアンダースコア "_" を変数名に含めた場合、これらの文字はエンコードされて渡されます。
元の変数名(例) | CGI に渡される変数名 |
hy-phen | hy%5fphen |
under_score | under%2dscore |
ハイフンとアンダースコア以外は調べていませんが、とりあえず変数名にはアルファベット 26 文字と数字だけを使うのが安全でしょう。どうしてもこれらの文字を使いたい場合には、 CGI 側で受け取った後に、デコードしてやる必要があります。
Perl # (念のため)URLデコードの方法 $str =~ tr/+/ /; $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
変数の値の渡され方にもクセがあります。普通、変数の値にイコール "=" が含まれている場合には、 "%3d" とエンコードされますが、 J-SKY の場合はエンコードされずに "=" のまま CGI で受け取ることになります。
変数名(例) | 値(例) | CGI への渡され方 | |
普通の場合 | J-SKYの場合 | ||
equation | a=b | equation=a%3db | equation=a=b |
変数名と値の区切りに使われているのも "=" なので、 Perl の split 関数などで処理を行う場合には、分ける個数を明確に指定する必要があります。次のように書けば、初めの "=" だけが区切り記号として解釈されます。
Perl # 変数名と値のsplit ($name,$value) = split(/=/,$ENV{'QUERY_STRING'},2);
次のように <form> タグを <a> タグで囲むと入力フォームが機能しなくなるようです。ページ内の入力フォームにリンクさせる場合には注意してください。
HTML
(フォームが機能しない例)
<a name="form">
<form action="xxxx.cgi" method="get">
<input type="text" name="mail" maxlength="64">
<input type="submit" value="送信">
</form>
</a>
(改善策)
<a name="form">メール入力</a>
<form action="xxxx.cgi" method="get">
<input type="text" name="mail" maxlength="64">
<input type="submit" value="送信">
</form>
CGIぽんはINFOJAMの安価で快適なサーバを利用しています。
|
CGIぽん (C)Copyright 2000-2002 OGATA,Tetsuji
|