- PR -

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

投稿者投稿内容
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-04-26 21:01
つばさです。

末記入さまの指摘どおりですね。
byte[] b = req.getParameter("key").getBytes("Windows-31J");
でMS932の変換表を使って変換されたものが返ってくるはずですね。

また、DBがShift_JISとの事ですので、〜\‖−¢£¬をDBからとり
出したらMS932の変換表で変換できるUNICODEに変換する必要があり
ますね。
例えば、
String dbdata をデータベースから取得した値として
String result = new String(dbdata.getBytes("Shift_JIS"), "Windows-31J");
のようにすれば、大丈夫かと思います。

もうすこしと思いますので、頑張ってください。


seki
常連さん
会議室デビュー日: 2005/03/23
投稿数: 29
投稿日時: 2005-04-28 14:18
つばささん、未記入さん:

長い時間かかりましたが、ようやく達成する事が出来ました。
色々ありがとうございました。
下記に今回のことを纏めておこうと思います。
また1点だけ最後に疑問が残っていまして、最後に記述させて頂きました。

【DBの文字コード】
"Shift-JIS"です。

【charsetの指定】
JSP全て → charset=Windwos-31J、
(Fillterにて実装)
request.setCharacterEncoding("Windwos-31J")
response.setContentType("Windwos-31J")

@ 画面からのrequest取得時
  byte []b = request.getParameter("key").getBytes("Windows-31J");

※ このbyte bをInputStreamにして入力禁止文字チェックを行う。

A DBへinsert/Update時
  上記@のチェックで正常であれば、requestのパラメタを
  "Windows-31J"→"Shift-JIS"に変換する。
  変換した値で、DBをinsert/Updateする。

String sKey = new String (request.getParameter("key").
getBytes("Windows-31J"), "Shift-JIS");

B DBから取得した値を画面へ表示する場合
  ※ DBから取得した値は、String sDbValue とする。
※ DBから取得した値を、"Shift-JIS"→"Windows-31J"に変換する。

    String sKey = new String (sDbValue.getBytes("Shift-JIS"), "Windows-31J");

上記sKeyは、"Windows-31J"としてStringに格納されているので、JSP画面も
    charset=Windwos-31Jと指定されているので文字化けしない。

    "〜\‖−¢£¬"などの文字も、文字化けせずに表示されています。

【懸念点】
 Windows-31Jでは"〜\‖−¢£¬"はUnicodeのマッピングに問題がある為、
化けると聞いていたのですが、化けませんでした。
明示的にcharsetを指定してString変換すれば大丈夫なのでしょうか?
 入力禁止文字チェッククラスでHexで見ても、確かにShift-JISのコードです。
 私の認識不足だと申し訳ないのですが、Stringは単なる入れ物みたいなものなのでしょうか?
 JavaはStringはUnicodeで保持するとどのサイトでも書かれていますが、
そこがイマイチ理解出来ていません。
_________________
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2005-04-28 23:34
つばさです。
目的を達成されたようで、まずは、おめでとうございます。

例えば、区点コード01-33の「〜」(Shift_JIS 0x8160)は、
JIS変換表(Shift_JIS)を使ってUnicodeに変換すると0x301Cに変換されます。
MS変換表(Windwos-31J)を使ってUnidodeに変換すると0xFF5Eに変換されます。
この変換表の違いを意識しないと文字化けするという事です。
以下のURLがとても参考になると思います。
http://www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.html

windowsのPC上で以下のようにコーディングすると
String data = "〜";
Javaの内部的にはUNICODEで0xFF5Eになります。
Shift_JISのDBに入れるときは、0x301Cに変換していれます。
(自分でやる必要があるのかJDBCドライバがやってくれるかと思います)
DBから取り出したらまた、0x301C→0xFF5Eに変換します。
0xFF5Eならば、Windows-31Jの変換表ではShift_JISの0x8160に戻せる
といった流れでしょうか。

「"Windows-31J"としてStringに格納されている」という表現をされて
いましたが、「Windows-31J(MS変換表)を使って変換されたUNICODE
がStringに格納されている」だと思います。



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