CGIぽん
モバイル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);

<a> タグとの併用

次のように <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>

関連リンク

公式サイト
J-SKY ウェブ
非公式サイト
J-TIPS

このページの履歴

2001.11.05
初版。

CGIぽんはINFOJAMの安価で快適なサーバを利用しています。