2010年6月15日火曜日

struts2+文字コードでおきたバグ

【前提】
・struts2を使用
・入力された文字列と単位を出力する
・文字列が「 _ 」の場合は、単位を出力しない

以下のような形でデータ出力している。
 <s:property value="number"/>
 <s:if test="number!= '_'"><s:property value="unit"/></s:if>

【事象】
特定の文字列「95」を入力すると、単位表示がされない。
例)
33円
50円
62円
87円
95
100円

【原因】
struts2では、文字列が一文字の場合、シングルコーテーションで囲むと
char型で判断される。
http://mofuken.blogspot.com/2009/07/struts2-sifognl.html


 ←の判定式で、アンダースコアをシングルコーテーションで
囲んでいるため、
http://homepage2.nifty.com/miyuki-t/html/cardinalnum.html

ハイフンの文字コードが16進数だと5Fで、10進数であらわすと「95」
「95の値が入力されたとき「_」と同じと判断されて単位表示が
されなくなる。

char型
 Javaでは、文字を扱うための型として、charが用意されています。char型は、Unicodeの1文字分と同じく、16ビットで表現します。
 char型は、整数型の一種です。char型には0以上、65535以下の整数値が入ります。具体的には、整数値として、Unicode文字のコード番号を入れて使います。
 文字を扱う型と言っても、その実体は整数ですから、整数に関して実行可能な演算は、char型に関しても実行可能です。つまり、加減乗除、剰余、比較などが行えます。

文字リテラル
 char型の値を表すのには、文字リテラルが使用できます。文字リテラルは、1個の文字をシングル・クォート(')で囲んで表します。例えば、
'A'

は文字リテラルです。
引用元:http://www.itarchitect.jp/beginners/-/10422-2.html

【解決方法】
下のブログにあるようにダブルコーテーションで囲むと文字列として
解釈されるので、回避できる。

http://mofuken.blogspot.com/2009/07/struts2-sifognl.html

結果的にソースとしては↓みたいにしたら直った。
<s:property value="number"/>
<s:if test="number!= \"_\""><s:property value="unit"/></s:if>

0 件のコメント:

コメントを投稿