HDML Language

変数について

HDMLでは、変数を使用することができる。
これにより、ユーザーの入力や選択により表示内容や移動先を変化させることが出来る。
また、CGIなど、他のアプリケーションに変数を渡し、アプリケーション上の作業を終了後、再度変数を
受け取るということも可能。
デッキ(アクティビティ)内の変数の受け渡しは、GETメソッドにより行われるので、変数名には
日本語を使用できない。(変数名に格納される「値」は、日本語でも良い。)

  1. 変数名の制限
  2. 変数のスコープ(有効範囲)
  3. ENTRYカード及びCHOICEカードにおける変数の使用
  4. 変数の明示的な指定方法(VARSオプション)
  5. 変数の初期化
  6. 変数の参照(代入)
  7. esc/noesc
  8. 他のアプリケーションに変数を渡す
1.変数名の制限
変数名の指定には以下のような制限がある。
  • 次に示す記号は変数名に使用できない(もちろん日本語は使用不可)。
    $ , < , > , = , / , \ , & , * , #
    これらは、HDML言語の記述で独自の意味を持つものである。
  • 変数名では、大文字と小文字が区別される。
    var , Var , VAR これらは、全て違う変数名と見なされる。
  • 変数名は短く。携帯電話のメモリには限りがあるので長い変数名を使用するとその分、
    メモリが余計に消費される。変数名を長くするとエラーになるということはないが、留意して
    おいたほうがよい。
  • 変数は多用しない。理由は上の項目に同じ。
  • 変数は再帰的に使用しない。再帰的な変数の参照は無効となる。
    例: $($varName)

Go to Top

2.変数のスコープ(有効範囲)
あるカードで指定した変数が有効なのは、カレントアクティビテイ内のみ。
具体的には、GOSUBで移動するまでは、他のデッキ(ファイル)であってもそれぞれの変数を参照
できるということになる。
ただし、VARSオプションを指定すれば、アクティビティ間での変数の受け渡しが可能。
例2-1
アクティビティ内では他のデッキ(ファイル)でも変数の参照が可能

(first.hdml)

<HDML VERSION=3.0>
<ENTRY KEY=num>
<ACTION TYPE=ACCEPT TASK=GO DEST=second.hdml>
好きな数字を入力してください:
</ENTRY>
</HDML>
好きな数字を入力して
ください:
7

文字         OK
(second.hdml)
<HDML VERSION=3.0>
<DISPLAY>
あなたの好きな数字は<BR>
$(num) ですね。
</DISPLAY>
</HDML>
あなたの好きな数字は
7 ですね。


OK
例2-2
他のアクティビティでは、例え同じデッキ(ファイル)内でも変数の参照不可
<HDML VERSION=3.0>
<!--First Activity-->
<ENTRY KEY=num>
<ACTION TYPE=ACCEPT TASK=GOSUB DEST=#second>
好きな数字を入力してください:
</ENTRY>
<!--Second Activity-->
<DISPLAY NAME=second>
あなたの好きな数字は<BR>
$(num) ですね。
</DISPLAY>
</HDML>
好きな数字を入力して
ください:
7

文字         OK
あなたの好きな数字は
ですね。


OK


例2-3
上記例2-2を変数参照可能にする
<HDML VERSION=3.0>
<!--First Activity-->
<ENTRY KEY=num>
<ACTION TYPE=ACCEPT TASK=GOSUB DEST=#second
VARS=num=$(num)>
好きな数字を入力してください:
</ENTRY>
<!--Second Activity-->
<DISPLAY NAME=second>
あなたの好きな数字は<BR>
$(num) ですね。
</DISPLAY>
</HDML>
好きな数字を入力して
ください:
7

文字         OK
あなたの好きな数字は
7 ですね。


OK

Go to Top

3.ENTRYカード及びCHOICEカードにおける変数の使用
変数を使用することが多いのは、ENTRYカード及びCHOICEカード。
いずれもKEYオプションを使用して変数名を指定する。
KEYオプションで渡せる変数は、1カードにつき、1個。

<ENTRYカード>

KEYオプションを使用して変数名を指定する。
ユーザーが入力した値が、その変数名に格納される。
例3-1
変数の基本的な受け渡し(ENTRYカード)
<HDML VERSION=3.0>
<ENTRY KEY=yourname>
<ACTION TYPE=ACCEPT TASK=GO DEST=#show>
あなたのお名前:
</ENTRY>
<DISPLAY NAME=show>
こんにちは!<BR>
$yournameさん
</DISPLAY>
</HDML>
あなたのお名前:
きむら


文字         OK
こんにちは!
きむらさん


OK
上記例のように、まず変数名をKEYオプションで指定する。
そしてそれを参照(代入)させるには、その変数名の頭に$(ドル)記号をつける。
ユーザーが「きむら」と入力すれば、次のディスプレイカードの$yournameの部分は、
「きむら」となる。

<CHOICEカード>

KEYオプションを使用して変数名を指定する。
ユーザーが選択した項目の値が、その変数名に格納される。
例3-2
変数の基本的な受け渡し(CHOICEカード)
<HDML VERSION=3.0>
<CHOICE KEY=feel>
<ACTION TYPE=ACCEPT TASK=GO DEST=show>
今のご気分は?
<CE VALUE=上機嫌>上機嫌
<CE VALUE=ご機嫌ななめ>ご機嫌ななめ
<CE VALUE=不機嫌>不機嫌
<CE VALUE=どん底>どん底
</CHOICE>
<DISPLAY NAME=show>
あなたは今、<BR>
$feelなんですね。
</DISPLAY>
</HDML>
今のご気分は?
1上機嫌
2ご機嫌ななめ
3不機嫌
4どん底

OK
1を選択
あなたは今、
上機嫌なんですね。



OK
上記例のようにまずKEYオプションで変数名を指定する。
そして、選択項目それぞれにVALUEオプションで値を指定しておく。
参照するには、変数名の頭に$(ドル)記号をつける。
ユーザーが、「1.上機嫌」を選択すれば、その値である「上機嫌」が
次のディスプレイカードの$feelの部分に表示される。

Go to Top

4.変数の明示的な指定方法(VARSオプション)
VARSオプションを指定すると、変数のリストを作成し、他のカードにそれらの変数を渡すことが出来る。
ENTRYカード・CHOICEカードでは、KEYオプションの指定により、変数の受け渡しが可能だが、このVARSオプションを使用すると、より明示的に複数の変数の受け渡しが出来る。
指定方法は、

VARS=変数1=値1&変数2=値2&変数3=値3.....

VARSオプションは、<ACTION>タグ及び<CE>タグ内で使用できる。
変数の値を変数名でなく、直接指定する場合はURLエスケープが必要。
例えば、"My First HDML" という文字列を渡す場合、スペースを + に変換しておく必要がある。

(2002/07/10追記)
EZサーバの自動変換機能が追加された模様で、現在は、URLエスケープの必要はありません。
日本語をそのまま指定しても、EZweb実機では、エラーなくデータが渡ります。
ただし、変数名に日本語を使用することはできません。
<例>VARS="var1=ようこそ!!&var2=My First HDML"

例4-1
変数をセットする
<HDML VERSION=3.0>
<DISPLAY>
<ACTION TYPE=ACCEPT TASK=GO DEST=#msg
VARS="var1=Welcome!&var2=My+First+HDML">
OKを押すと<BR>
メッセージを表示します。
</DISPLAY>
<DISPLAY NAME=msg>
<CENTER>$var1<BR>
<CENTER>$var2
</DISPLAY>
</HDML>
OKを押すと
メッセージを表示します


OK
Welcome!
My First HDML


OK

Go to Top

5.変数の初期化
ユーザーに意識させることなく、変数の値を設定したり、初期化してしまいたい場合には、
NODISPLAYカードを用いる。

(2002/07/10追記)
EZサーバの自動変換機能が追加された模様で、現在は、URLエスケープの必要はありません。
日本語をそのまま指定しても、EZweb実機では、エラーなくデータが渡ります。
ただし、変数名に日本語を使用することはできません。
<例>VARS="var1=ようこそ!!&var2=My First HDML"

例5-1
4-1の例を自動的に行う
<HDML VERSION=3.0>
<NODISPLAY>
<ACTION TYPE=ACCEPT TASK=GO DEST=#msg
VARS=var1=Welcome!&var2=My+First+HDML>
</NODISPLAY>
<DISPLAY NAME=msg>
<CENTER>$var1<BR>
<CENTER>$var2
</DISPLAY>
</HDML>
Welcome!
My First HDML


OK
ユーザーは、何の操作もせずに
2番目のカードが表示される。
(これは、あくまでも変数初期化の一例として挙げたもので、実際にはこのような使い方はまずしない。)
例5-2
もっと有効にNODISPLAYカードで変数をセットする
この例は、少々ややこしいです。理解しにくい時は、すっとばしてください。例5-1が理解できればOK。
<HDML VERSION=3.0>
<NODISPLAY>
<ACTION TYPE=ACCEPT TASK=GO DEST=#disp VARS=star=%81%9a>
</NODISPLAY>
<DISPLAY NAME=disp>
<ACTION TYPE=ACCEPT LABEL=Reset>
<ACTION TYPE=SOFT1 TASK=GOSUB DEST=#$(star) LABEL="+1" RECEIVE=star>
このサイトを星の数で評価。
<BR>(3個が最高、1個が最低)
<BR>$star
<BR><A TASK=GOSUB DEST="hyouka.cgi?STAR=$(star)" LABEL=決定>評価を送信</A>
<BR><A TASK=GOSUB DEST=? LABEL=Reset>リセット</A>
</DISPLAY>
<NODISPLAY NAME=%81%9a>
<ACTION TYPE=ACCEPT TASK=RETURN RETVALS=%81%9a%81%9a>
</NODISPLAY>
<NODISPLAY NAME=%81%9a%81%9a>
<ACTION TYPE=ACCEPT TASK=RETURN RETVALS=%81%9a%81%9a%81%9a>
</NODISPLAY>
<NODISPLAY NAME=%81%9a%81%9a%81%9a>
<ACTION TYPE=ACCEPT TASK=RETURN RETVALS=%81%9a%81%9a%81%9a>
</NODISPLAY>
</HDML>
例5-2で、"%81%9a"は、"★"をURLエスケープしたものです。
(2002/07/10追記)
EZサーバの自動変換により、RETVALSの値のURLエスケープは、不要となっています。
このサイトを星の数で評価
(3個が最高、1個が最低)

[評価を送信]
[リセット]
+1          Reset
(a) 最初に表示される画面
(最初のNODISPLAYカードが変数$starに"★"を代入)
現デッキを再表示
($starに"★"代入)
SOFT1
このサイトを星の数で評価
(3個が最高、1個が最低)
★★
[評価を送信]
[リセット]
+1           Reset
(b) (a)で"+1"すると...
このサイトを星の数で評価
(3個が最高、1個が最低)
★★
[評価を送信]
[リセット]
+1           決定
(2番目のNODISPLAYカードが$starに"★★"を代入し、最初の画面にRETURNする)
下に
スクロール
SOFT1
(c) (b)でさらに"+1"
このサイトを星の数で評価
(3個が最高、1個が最低)
★★★
[評価を送信]
[リセット]
+1           決定
画面(a)に戻る
(3番目のNODISPLAYカードが$starに"★★★"を代入し、最初の画面にRETURNする)
(b),(c) にて"決定"を選択すると、hyouka.cgi に
変数 $star が渡されます。
(hyouka.cgi は架空のスクリプトです)

Go to Top

6.変数の参照(展開)
変数の参照(展開)が可能な場所は以下の通り。
  • ENTRY/CHOICE/DISPLAYカードの表示部分のテキスト内
  • DESTオプション内
  • 選択項目(<CE>タグ)内
  • ENTRY/CHOICEカードのデフォルト値

Go to Top

7.esc/noesc
変数の値を代入する際、esc/noescオプションを指定できる。
これは、変数の値をURLエスケープするか否かを指定するオプションで、通常は何も指定しなくても、
自動的に判断されるので、特に意識する必要はない。
変数指定 説明
$var または $(var) 変数の値の文字列を自動的に判別。
必要と判断すればURLエスケープを行う。
$(var:esc) 英数字以外の文字は、URL表記の決まりに
従ってエスケープされる。
$(var:noesc) このオプションを指定するのは、主に以下の場合。
  • 既にURLエスケープされているとき
escオプションに関しては、通常は、携帯電話側で自動的に文字列を判別し、エスケープするか否かを決めるので、特に指定する必要はない(心配なら指定しておく)。
重要なのは、noescのほう。上の表に挙げた場合以外でnoescオプションを指定すべき例を挙げる。
例7-1
noescオプションをつける必要のある変数代入
<HDML VERSION=3.0>
<ENTRY KEY=url>
<ACTION TYPE=ACCEPT TASK=GO DEST=$(url:noesc)>
ジャンプしたい<BR>
URLを入力して<BR>
OKを押してください
</ENTRY>
</HDML>
ジャンプしたい
URLを入力して
OKを押してください
http://miyaki-ssi-n.com/

OK
ACCEPT
URLリクエスト
http://miyaki.ssi-n.com/
上記例において、noescオプションをつけなかった場合、URLリクエストは以下のような
URLとなってしまい、ジャンプできない。

   http%3a%2f%2fmiyaki.ssi-n.com%2f

Go to Top

8.他のアプリケーションに変数を渡す
HDML内で代入された変数をCGIなど、他のアプリケーションに渡すことができる。
以下の2つの方法がある。
  1. POSTメソッドの使用
    METHOD=POSTオプションを宣言し、さらにPOSTDATAオプションで
    渡す変数をセットする。
  2. GETメソッドの使用
    URLクエリ文字列の引数として、変数をセットする。

1. 2. ともに<ACTION>,<CE>,<A>〜</A>タグ内で指定できる。
Openwaveでは、1の方法を強く推奨している。
POSTメソッドを使用すると、携帯電話が送り出す文字セットを送り先のアプリケーションが理解できる文字セットに変換することができるという理由からのようだ。
ただし、日本のEZwebにおいては、文字セットがShift_JISに統一されており、送り先のアプリケーションがShift_JISで記述されていることが明らかであれば、これを意識する必要はない。

<POSTメソッドによる変数渡し>

<ACTION>または<CE>,<A>〜</A>タグ内でMETHOD=POSTを宣言し、
POSTDATAオプションで渡す変数の名前と値をセットする。

POSTDATA=変数1=値1&変数2=値2&変数3=値3.....

HTMLのフォームで言うと、変数1・2・3がname、値1・2・3がvalueということになる。

例8-1
METHOD=POSTで変数渡し
<HDML VERSION=3.0>
<CHOICE KEY=com>
<ACTION TYPE=ACCEPT TASK=GOSUB
DEST="http://miyaki.ssi-n.com/company.cgi"
METHOD=POST POSTDATA="COM=$com">
どの会社のデータですか?
<CE VALUE=宮木電機>宮木電機
<CE VALUE=オッキ電気>オッキ電気
<CE VALUE=○○電材>○○電材
</CHOICE>
</HDML>
どの会社のデータですか?
1宮木電機
2オッキ電気
3
○○電材

OK
を選択
URLリクエスト
http://miyaki.ssi-n.com/company.cgi
POSTDATA: COM=%8b%7b%96%d8%93d%8b%40
例8-2
EZサーバが日本語入力を認識するようになった為、
以下のようなことも可能となりました。
<HDML VERSION=3.0>
<CHOICE KEY=com>
<ACTION TYPE=ACCEPT TASK=GOSUB
DEST="http://miyaki.ssi-n.com/company.cgi"
METHOD=POST POSTDATA="会社名=$com">
どの会社のデータですか?
<CE VALUE=宮木電機>宮木電機
<CE VALUE=オッキ電気>オッキ電気
<CE VALUE=○○電材>○○電材
</CHOICE>
</HDML>



<GETメソッドによる変数渡し>

DESTオプション内で送り先アプリケーションのURLに"?"を付加し、それに続けて渡す変数の
名前と値をセットする。

DEST=URL?変数1=値1&変数2=値2&変数3=値3.....

例8-3
URLクエリ文字列の引数で変数渡し
<HDML VERSION=3.0>
<CHOICE KEY=com>
<ACTION TYPE=ACCEPT TASK=GOSUB
DEST="http://miyaki.ssi-n.com/company.cgi?COM=$com">
どの会社のデータですか?
<CE VALUE=宮木電機>宮木電機
<CE VALUE=オッキ電気>オッキ電気
<CE VALUE=○○電材>○○電材
</CHOICE>
</HDML>
どの会社のデータですか?
1宮木電機
2オッキ電気
3
○○電材

OK
1を選択
URLリクエスト
http://miyaki.ssi-n.com/company.cgi?COM=%8b%7b%96%d8%93d%8b%40
例8-4
EZサーバが日本語入力を認識するようになった為、
以下のようなことも可能となりました。
<HDML VERSION=3.0>
<CHOICE KEY=com>
<ACTION TYPE=ACCEPT TASK=GOSUB
DEST="http://miyaki.ssi-n.com/company.cgi?会社名=$com">
どの会社のデータですか?
<CE VALUE=宮木電機>宮木電機
<CE VALUE=オッキ電気>オッキ電気
<CE VALUE=○○電材>○○電材
</CHOICE>
</HDML>

Go to Top

Home Pageに戻る


最終更新日:2002年7月10日