- PR -

requestパラメータを、画面で指定したcharsetの文字で取得したい

投稿者投稿内容
seki
常連さん
会議室デビュー日: 2005/03/23
投稿数: 29
投稿日時: 2005-04-22 13:59
いつもお世話になります。

charset=Shift_JISで指定したWeb画面からのrequestを
getParameterを使用して取得すると、強制的にUnicodeに
変換されています。
(getParameterの戻り値がStringなので当り前かもしれませんが)

機種依存文字チェックを行いたいのですが、これではSJISのコード
でチェックできません。
@ → !)@になってしまっている。

request.getInputStream()では、特定のパラメータを取得出来ません
し、このような画面からの入力チェック(機種依存文字など)を皆さんは
どのように実装されているのでしょうか?
(JavaScriptでは出来ればやりたくないです。)

お忙しいところ、ご教示の程宜しくお願い致します。
_________________
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-04-22 14:12
パラメータを取得する前に、
コード:
request.setCharacterEncoding("shift_jis");


とやるとどうですか?
seki
常連さん
会議室デビュー日: 2005/03/23
投稿数: 29
投稿日時: 2005-04-22 15:51
Edossonさん:

JavaのFillterのdoFilterメソッドで、セットしております。
 ↓
request.setCharacterEncoding("Shift-JIS");

これは、requestの文字をShift-JISとして取得するという事と
認識してます。

JavaでgetParameterで取得後は、内部でUnicodeに変換されてしまいます。
パラメタの値をInputStream型で取りたいです。
(ファイルアップロードとかではなく、Formの普通のパラメータを
InputStream型で・・・。画像とかでは無い)

技術的に無理なのでしょうか?

_________________
末記入
会議室デビュー日: 2005/03/18
投稿数: 4
お住まい・勤務地: いなか
投稿日時: 2005-04-22 16:21
sekiさん:

フォームのmethodがPOSTであれば、ServletRequest#getInputStream()で
全てのパラメータが取得できるはずですが....

具体的にどのようなパラメータが取得できないのでしょう??
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2005-04-22 16:25
先ほどの回答は、はずしていたみたいですみません。
ところで、
引用:

パラメタの値をInputStream型で取りたいです。


が、よくわからないのですが、「InputStreamを通してデータを取得したい」と
いう解釈で合ってますでしょうか。

あと、取得した文字列が化けているとのことですが、入力フォームのある
Web画面のcharsetの設定に不具合があるのでは?
特に、JSPの場合は、metaタグの設定は効かないようです。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-04-22 16:27
引用:

request.setCharacterEncoding("Shift-JIS");



まず、「Shift-JIS」ではなく「Shift_JIS」ではないかと思います。
さらに、「Windows-31J」での取り込みが本来やりたいことではないかと思いますが……。

「正しく取り込んだ機種依存文字」を「一般的な類似文字」に置き換えるような処理をしたことはあります。変換はUnicode→Unicodeで。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-04-22 16:33
エンコーディングをShift_JISではなく、Windows-31Jにしてみたらどうなりますか?
seki
常連さん
会議室デビュー日: 2005/03/23
投稿数: 29
投稿日時: 2005-04-22 17:57
書き込み頂いた皆さん:

多くのご返答ありがとうございます。

私の説明が不足していたようです。

【私のやりたいこと】
@ ファイルアップロード、及び画面入力より、機種依存文字をチェック
  したい。
  (ファイル、及び画面入力はShift_JISである。DBの制約により
   Windows-31Jは使用しない)

A ファイルアップロードでは、ファイルデータをServletInputStream
  で取得出来る。
  InputStreamなので、byte配列に格納して、Shift_JISのコードで
  機種依存文字のチェックを出来る。
  (2バイト文字の2バイト目=nが、 if (0x40 <= n && n <= 0x9e)というように
   チェック)
  → この、機種依存文字チェッククラスを作成しました。

B Aで作成したチェッククラスを、画面入力チェックでも使用したい。
  (共通クラスとして、同じチェッククラスを使用したい)

C ところが、request.getParameterを使うと、戻り値が既にString
  なので(Unicode)Aのチェッククラスが使えない。

  例えば、request.getParameter("user").getBytes("Shift_JIS")
としてbyteにしても、その時点でUnicodeに変換されている。
  (ヘキサで見てもそうなっている)


> 永井和彦さんへ:
→ Shift_JISでも結果は同じでした。
  Windows-31Jは、Unicodeで「〜‖−¢£¬\」とかが化ける為、
  わざと使用したくないのです。

>Edossonさんへ:
>Web画面のcharsetの設定に不具合があるのでは?
→ charset=Shift_JISを設定してます。
  request.setCharacterEncoding("Shift_JIS")
response.setContentType("Shift_JIS")
in/outは全て"Shift_JIS"で統一しています。

>末記入さんへ:
→ ServletRequest#getInputStream()では、他のパラメタ取得で
  getParameterが使用できなくなります。
  例えば、<form>タグにuserとpasswdがある場合、
  1. userだけInputStreamで取り込みたい(入力チェックを行いたい)
  2. passwdは入力チェックを行わないのでgetParameterで取り込みたい。

  ※ この場合、2.が出来なくなります。(APIにも書いていました)

>Edossonさんへ:
→ request.setCharacterEncoding("shift_jis");でも同じでした。

_________________

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