- ベストアンサー
Web上で「~」が文字化けして表示されてしまう
Web上の画面から入力したデータを、サーバー上のデータベースに保存するシステムにおいて、入力(保存)されたデータが文字化けして表示されてしまうことがあります。 具体的には、「~」と入力した場合、再度その画面を呼び出して表示してみると、「?」に文字化けしてしまいます。データベース上は「~」で保存されているのですが、どうもweb上で表示する際に文字化けしているようなのです。 なお、環境は、ブラウザがIE6.0、画面はJSPにて作成、データベースはOracle8です。 文字化けの起こる原因もしくは対策など、ご存知でしたら教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> "~"が文字化けするのは、Oracle JDBC を使ったプログラムでよくある問題です。 もちろんJDBCも文字化けのよく現れる原因のとつですが、 むしろ参考にされているOracleの場合はそのJDBCドライバが非常に効率よく エンコードの違いを吸収してくれるような設計がなされているようなので 良くある問題ではないと思います。PostgresやmySQLをLinuxベースと いうのであればかなり関わってくるとは思いますが・・・ むしろ、COOKY2さんの言われるように入力、出力ストリームにおいてその問題は 顕著に出ると思うのですがどうでしょう??(今回もrespons内で起きているのでは?) 今回もDBCというよりも一般的にあるISO~MS932相互変換の問題だと思います。 それと、この問題は単に文字化けの問題ではなく波線のみ化けるということですよね?? もし、現在「SJIS」で文字コードを設定されているようであれば「MS932」で試して見てください。 一般的には「SJIS」と「MS932」の違いででるようです。 「SJIS」と「MS932」の違いについては割愛させてください。
その他の回答 (3)
- covachan
- ベストアンサー率38% (46/120)
すみません。自己レスです。 前半、ちょっと怪しいことを書いたようです。 結局のところ変換はいることに違いはないのでストリームだろうがJDBCだろうが 同じことですね。 yujiさん、申し訳ありませんでした。
- yuji
- ベストアンサー率37% (64/169)
"~"が文字化けするのは、Oracle JDBC を使ったプログラムでよくある問題です。 OTNの掲示板のJavaの部屋に過去にいくつか同じ問題があり、回答も出されています。検索してみてはいかかでしょうか? 簡単に言うと、JDBCを使って文字データを取得した 後に、自分で文字コード変換を行う必要があります。 ちなみに、この問題は環境に依存する問題なので、 こう変換すれば必ずうまくいきます、 という答えは存在しません。
- 参考URL:
- http://otn.oracle.co.jp/
お礼
ご指摘のとおりOTNの掲示板を見たところ、同じような質問がたくさん寄せられており、とても参考になりました。 どうもありがとうございました。
- COOKY2
- ベストアンサー率28% (2/7)
入力ストリームで日本語は文字化けします。 お約束と思って、<%! %>に以下のような、クラスを準備し、実際のStringオブジェクトに適用すれば、どうでしょうか。 例)String strParam = strEncode(request.getParameter("parameter_name")); ---------------------------------------------------------------- //REQUESTデータの文字化け対策 public String strEncode(String strVal) throws UnsupportedEncodingException{ if(strVal == null){ return (null); }else{ return (new String(strVal.getBytes("ISO-8859-1"),"Shift_JIS")); } }
お礼
返事が大変遅くなり、申し訳ありません。 文字の取り扱いについての知識不足のため、勉強しなおしていました。 さて、回答していただいた方法で試してみたのですが、残念ながら同じ結果になりました。 今回の場合、DBのデータを読み込んで画面に表示する段階で文字化けしているらしいことと、現段階では「~」のみ文字化けが起きているようだったので、Shift_JISとMS932での文字コードが異なることによる現象かと思い、以下のような方法を用いることで、とりあえず解決しました。 方法:以下のようなクラスを用意し、文字化けを起こす可能性のある文字に大して適用する。 public static String MojiConv( String s ) { char[] chr; chr = s.toCharArray(); for ( int i = 0; i < chr.length; ++i ) { switch ( (int)chr[i] ) { case 0x301C : chr[i] = 0xFF5E; break; // ~ default: break; } } return new String( chr ); } COOKY2さんのご回答は、他の部分でも役立ちそうです。どうもありがとうございました。
お礼
>今回もDBCというよりも一般的にあるISO~MS932相互変換の問題だと思います。 >それと、この問題は単に文字化けの問題ではなく波線のみ化けるということですよね?? > もし、現在「SJIS」で文字コードを設定されているようであれば「MS932」で試して見てください。 >一般的には「SJIS」と「MS932」の違いででるようです。 MS932でも試してみたのですが、同じように文字化けしてしまいました。 でも、「SJIS」と「MS932」の違いというご指摘のおかげで、いろいろ試してみた結果、なんとか解決しました。 具体的な解決方法は、回答No.1のCOOKY2さんへのお礼のところに載せておきました。 Javaでは(Javaに限らず?)、文字の取り扱いの問題は避けて通れないものなんだと身にしみてわかりました。 どうもありがとうございました。