- PR -

全角文字の受け渡しについて

1
投稿者投稿内容
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2006-01-06 12:11
現在、Windowsのローカル環境にてWebアプリを作成し、Linuxに移行して動作を確認をしています。それで、今までローカルにおいてはJSPで作成した入力画面からstrutsのActionFormにて値を受け取ってDBに登録をしていました。
しかし、Linuxの環境上で動かすとSQLExceptionが返って来てしまいました。
それで、調査をした所、JSPの入力画面で全角文字を入力した場合、受け取る際のActionFormではほとんどが空白で入ってしまっています。なかには文字化けをしている箇所もありました。ちなみに半角の場合においてはちゃんとデータが受け取れています。
自分の考えではLinuxの移行にともなって文字コードをShift-JISからeuc-jpに変更したからかなと考えていますが、現在の知識では分かりませんでした。
下記のソースで何か気になる箇所がありましたら教えて頂けますでしょうか。

ローカル環境
WindowsXP Pro
J2SE 1.4.2_10
Tomcat 4.1.36
Struts 1.1

サーバー環境
Linux Fedora Cora
J2SE 1.4.2_10
Tomcat 4.1.36
Struts 1.1

================================================================
regist.jsp
================================================================
<%@ page language="java" contentType="text/html; charset=euc-jp"
pageEncoding="euc-jp"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html:html xhtml="true">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp" />
</head>
<body>
<h1>新規登録</h1>
<h2>※入力項目は全て必須です</h2>
<!--エラー表示用-->
<p><html:errors /></p>
<!--入力項目-->
<html:form action="/inConfirm" method="post">
<dl id="form">
<dt>ユーザーID:</dt>
<dd>
<html:text property="userId" size="25" maxlength="16" styleId="kentext" styleClass="imeModeDisabledEnglishMath" />
<p>※半角英数字</p>
</dd>
<dt>ユーザーパスワード:</dt>
<dd>
<html:text property="userPass" size="25" maxlength="16" styleId="kentext" styleClass="imeModeDisabledEnglishMath" />
<p>※半角英数字</p>
</dd>
<dt>苗字:</dt>
<dd>
<html:text property="nameFamily" size="25" maxlength="8" styleId="kentext" styleClass="imeModeOnJapanese" />
<p>※全角文字</p>
</dd>
<dt>名前:</dt>
<dd>
<html:text property="nameFirst" size="25" maxlength="8" styleId="kentext" styleClass="imeModeOnJapanese" />
<p>※全角文字</p>
</dd>
<dt>苗字カナ:</dt>
<dd>
<html:text property="nameFamilKana" size="25" maxlength="8" styleId="kentext" styleClass="imeModeOnJapanese" />
<p>※全角カナ</p>
</dd>
<dt>名前カナ:</dt>
<dd>
<html:text property="nameFirstKana" size="25" maxlength="8" styleId="kentext" styleClass="imeModeOnJapanese" />
<p>※全角カナ</p>
</dd>
<dt>権限:</dt>
<dd>
<html:radio property="authority" value="営業" />営業
<html:radio property="authority" value="講師" />講師
<html:radio property="authority" value="マスター" />マスター
<html:radio property="authority" value="その他" />その他
</dd>
<dt class="hide">遷移ボタン</dt>
<dd>
<html:submit value="新規登録" styleId="regist" />
</dd>
</dl>
</html:form>

</body>
</html:html>
=========================================================
ActionForm.java
=========================================================
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import java.io.UnsupportedEncodingException;

/**
* 更新確認時のアクションフォームクラスです。
*/
public class InsertConfirmForm extends ActionForm{

private String autoNum = "";
private String userId = "";
private String userPass = "";
private String nameFamily = "";
private String nameFirst = "";
private String nameFamilKana = "";
private String nameFirstKana = "";
private String authority = "";

public String getAutoNum() {
return autoNum;
}

public String getUserId() {
return userId;
}

public String getUserPass() {
return userPass;
}

public String getNameFamily() {
return nameFamily;
}

public String getNameFirst() {
return nameFirst;
}

public String getNameFamilKana() {
return nameFamilKana;
}

public String getNameFirstKana() {
return nameFirstKana;
}

public String getAuthority() {
return authority;
}

// セッター
public void setAutoNum(String autoNum) {
this.autoNum = autoNum;
}

public void setUserId(String userId) {
this.userId = userId;
}

public void setUserPass(String userPass) {
this.userPass = userPass;
}

public void setNameFamily(String nameFamily) {
this.nameFamily = nameFamily;
}

public void setNameFirst(String nameFirst) {
this.nameFirst = nameFirst;
}

public void setNameFamilKana(String nameFamilKana) {
this.nameFamilKana = nameFamilKana;
}

public void setNameFirstKana(String nameFirstKana) {
this.nameFirstKana = nameFirstKana;
}

public void setAuthority(String authority) {
this.authority = authority;
}

//入力チェック
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request){

ActionErrors errors = new ActionErrors();
Validate val = new Validate();

         //デバック
System.out.println("------------------------------------------------");
System.out.println(userId);
System.out.println(userPass);
System.out.println(nameFamily);
System.out.println(nameFirst);
System.out.println(nameFamilKana);
System.out.println(nameFirstKana);
***************************************************************************
     ↑この時点で全角で入力した nameFamily,nameFirst,nameFamilKana,nameFirstKanaの値が空白
***************************************************************************

//空欄チェック
errors = val.isNotNull("userId", "ユーザーID", userId);
errors = val.isNotNull("userPass", "ユーザーパスワード", userPass);
errors = val.isNotNull("nameFamily", "苗字", nameFamily);
errors = val.isNotNull("nameFirst", "名前", nameFirst);
errors = val.isNotNull("nameFamilKana", "苗字カナ", nameFamilKana);
errors = val.isNotNull("nameFirstKana", "名前カナ", nameFirstKana);
errors = val.isNotNull("authority", "権限区分", authority);

//桁数チェック
int mojiCount = 18;
errors = val.isCountOver(mojiCount, "userId", "ユーザーID", userId);
errors = val.isCountOver(mojiCount, "userPass", "ユーザーパスワード", userPass);
errors = val.isCountOver(mojiCount, "nameFamily", "苗字", nameFamily);
errors = val.isCountOver(mojiCount, "nameFirst", "名前", nameFirst);
errors = val.isCountOver(mojiCount, "nameFamilKana", "苗字カナ", nameFamilKana);
errors = val.isCountOver(mojiCount, "nameFirstKana", "名前カナ", nameFirstKana);

//半角チェック
errors = val.isNotZenkaku("userId", "ユーザーID", userId);
errors = val.isNotZenkaku("userPass", "ユーザーパスワード", userPass);

//全角チェック
System.out.println(nameFamily);
System.out.println(nameFirst);
errors = val.isZenkakuOnly("nameFamily", "苗字", nameFamily);
errors = val.isZenkakuOnly("nameFirst", "名前", nameFirst);
errors = val.isZenkakuOnly("nameFamilKana", "苗字カナ", nameFamilKana);
errors = val.isZenkakuOnly("nameFirstKana", "名前カナ", nameFirstKana);


//戻り値設定
return errors;
}
}


[ メッセージ編集済み 編集者: まつじん 編集日時 2006-01-06 12:22 ]
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-01-06 13:01
request.setCharacterEncoding("JISAutoDetect");

とか。
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2006-01-06 15:44
mioさん、ご返答ありがとうございます。
request.setCharacterEncoding("JISAutoDetect");
を試してみましたが駄目でした。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-01-06 16:46
おそらくフォームからサブミットされてくる文字コードがEUCなのにShift_JISでエンコードしてるせいですね。
setCharacterEncodingにEUC-JPを与えてください。

引用:
自分の考えではLinuxの移行にともなって文字コードをShift-JISからeuc-jpに変更したからかなと考えていますが、現在の知識では分かりませんでした。


そもそもこの変更を行う必要がないと思います。Shift_JISのままで動作するはずです。
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2006-01-06 17:23
Anthyhimeさん、ご返答ありがとうございます。
EUC-JPにおいて試してみましたが、駄目でした。

引用:

そもそもこの変更を行う必要がないと思います。Shift_JISのままで動作するはずです。



Linuxについては無知識でしたので最初はShift-JISでやろうと
したのですが、Linux側のTomcatにエラーを出されました。
それで、Linuxで調べていたらEUC-JPでアップするようにと書かれていましたので
入力のjspファイルをEUC-JPで試したら表示出きるようになりました。
Anthyhimeさんの言われていることと違いましたら申し訳ありません。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-01-06 17:42
普通に配備すればJSPの文字コードが何であるかは全く問題ないです。
そのためにEncoding系のディレクティブがあるわけですから。
クラスは文字コードに依存しますが、VMの起動パラメータで利用文字コードを指定したり、コンパイル時に-encodingでクラスの文字コードを指定することができます。
引用:
EUC-JPにおいて試してみましたが、駄目でした。


どのような試され方をしていますか?
setCharacterEncodingはFilterでStrutsの前に行う必要があります。
まつじん
ベテラン
会議室デビュー日: 2005/12/02
投稿数: 54
投稿日時: 2006-01-06 18:10
Anthyhimeさん、ご返答ありがとうございます。
どうやら自分の知識不足で間違って意見を受け取っていました。
先ほどまではActionFormの中のValidateメソッドで
request.setCharacterEncoding("EUC-JP")をやっていました。
それをFilterクラスを作成し、web.xmlから最初に呼べばいいのでしょうか?
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-01-07 01:05
引用:
先ほどまではActionFormの中のValidateメソッドで
request.setCharacterEncoding("EUC-JP")をやっていました。



Filterでリクエストの処理開始前にやるのが定石です。
validate()のタイミングではもうHttpServletRequestから
パラメータを取得した後なので意味がないのです。
1

スキルアップ/キャリアアップ(JOB@IT)