- - PR -
requestパラメータを、画面で指定したcharsetの文字で取得したい
«前のページへ
1|2|3
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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"); のようにすれば、大丈夫かと思います。 もうすこしと思いますので、頑張ってください。 |
|
投稿日時: 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-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に格納されている」だと思います。 |
«前のページへ
1|2|3