• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UTF-8で書かれたJSPの日本語文字コード変換の正しい方法がわかりません)

UTF-8でJSPの日本語文字コード変換ができない場合の対処方法

このQ&Aのポイント
  • JSPの文字コード変換方法がわからない場合、UTF-8で書かれた日本語文字列を正しく扱う方法が必要です。
  • JSPのコード内に記述された文字コード変換の処理を修正することで、正しい結果を得ることができます。
  • クライアントとサーバの文字コードが異なる場合、文字列の変換が必要です。ハッシュのキーを検索する際にも、文字コードを考慮して行う必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
noname#33813
noname#33813
回答No.1

1.このソースをUTF-8で保存していること。 ※例えばWindowsのメモ帳だとShift_JIS(Windows-31J)で保存されてしまいます。 2.Tomcatのconfフォルダ内にあるweb.xmlでJSPのjavaEncodingをUTF-8で指定していること。 ※確かTomcatはデフォルトでUTF-8だった気がしますが、念のため 3.8行目の >return new String( strVal.getBytes( "ISO-8859-1" ), "JISAutoDetect" ); ですが JISAutoDetectの場合UTF-8は自動認識されなかったと思います。 基本的に自動にまかせるのではなくクライアントから送出される文字コードがわかっている場合は明示すべきです。 今回は"JISAutoDetect"を"UTF-8"に変えてみてください。 以上の条件を満たせば正しく動くかと思いますのでご確認頂ければと思います。

nagilum
質問者

お礼

ARIA9様 助かりました! ちゃんと期待通りに動作するようになりました。 > 1.このソースをUTF-8で保存していること。 > ※例えばWindowsのメモ帳だとShift_JIS(Windows-31J)で保存されてしまいます。 これは自信ありです。 JSPのエディットは、Windows から Fedora へ SSH でログインして vi で行って おります。 > 2.Tomcatのconfフォルダ内にあるweb.xmlでJSPのjavaEncodingをUTF-8で指定していること。 > ※確かTomcatはデフォルトでUTF-8だった気がしますが、念のため 確認しました。 コメント中に javaEncoding は [UTF-8] と書いてありまして、 これはきっと、デフォルトが UTF-8 ってことですよね、ARIA9さんが言及されて いるとおり。 そして、xml本体中には javaEncoding を明示指定している箇所は存在しません。 よって、UTF-8 です。 > 3.8行目の > >return new String( strVal.getBytes( "ISO-8859-1" ), "JISAutoDetect" ); > ですが > JISAutoDetectの場合UTF-8は自動認識されなかったと思います。 > 基本的に自動にまかせるのではなくクライアントから送出される文字コードが > わかっている場合は明示すべきです。 > 今回は"JISAutoDetect"を"UTF-8"に変えてみてください。 これが原因でした。 ARIA9さんのご指示通りに修正したところ、うまくいきました。 でも、狐につままれたような気分です。 自分の理解では、元々のコード中の "JISAutoDetect" は、 クライアント(Windows+IE)から送られてくる Shift_JIS(Windows31J)を自動認識 するための記述だと思っていました。つまり、上記の return 文では   ISO-8859-1 でバイト列化したものは日本語かもしれないので   自動認識せよ という意味だと思っていたのです。 この return 文での "JISAutoDetect" を "UTF-8" に変更するとうまくいくという ことは、正しい解釈は   ISO-8859-1 でバイト列化したものを UTF-8 に変換せよ ってことでしょうか? 我ながら浅い頭脳で恥ずかしいのですが、解説をお願いできませんでしょうか。 よろしくお願いします。

その他の回答 (1)

noname#33813
noname#33813
回答No.2

nagilum様 No.1の回答をしたARIA9です。 ご質問の件回答致します。 >クライアント(Windows+IE)から送られてくる Shift_JIS(Windows31J)を自動認識 するための記述だと思っていました。 とありますが、クライアントから送られてくる文字コードは送り元ページのエンコーディング依存になります。 例えばグーグルをIEで開いて、IEの表示→エンコードを見るとUTF-8になっていると思います。 この場合にリクエストを発行すると送出されるデータはShift_JISではなくUTF-8になります。 掲載されていたソースで >contentType="text/html;charset=UTF-8" とありましたので恐らくリクエスト送出元のページがUTF-8であると見込みをたてて回答させて頂いていました。 >ISO-8859-1 でバイト列化したものは日本語かもしれないので >自動認識せよ >という意味だと思っていたのです。 こちらはその通りですが、JISAutoDetectはあくまで「きっとこれが正しいよ!」という 認識をするものですので必ず正しいコードを返す保障はありません。 システムで扱う文字コードに一意性を持たせて、明示的に文字コードを指定する方が良いでしょう。 参考URLでJDK1.6のJISAutoDetectについて掲載されていますのでご覧になってください。 ここを見るとUTF-8はJISAutoDetectで認識できないことがわかります。 >  ISO-8859-1 でバイト列化したものを UTF-8 に変換せよ >ってことでしょうか? その通りです。 ということで、今回はクライアントから送出されてくるリクエストデータが UTF-8であったが、Windows-31Jと思っていたことが根本的な原因だったと思われます。

参考URL:
http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/intl/encoding.doc.html
nagilum
質問者

お礼

ARIA9様 お礼が遅くなりました。ごめんなさい。 丁寧に解説をいただき、本当にありがとうございます。 おかげさまで、得心がいきました。 > ということで、今回はクライアントから送出されてくるリクエストデータが > UTF-8であったが、Windows-31Jと思っていたことが根本的な原因だったと思われます。 そのとおりですね。 件のJSPには encoding を指定していましたが、このJSPにジャンプする元の HTMLには特定の encoding を指定していませんでした。 なので、きっとデフォルトの Windows-31J だろうと思いこんでしまっていました。 IEというか、世のウェブブラウザは自分が考えていたよりもずっと賢くできて いるんですね。UTF-8で書かれたHTMLはちゃんとUTF-8として認識しているようです。 IEのポップアップメニューの「エンコード」を使って確認したところ、 ウェブサイトによってUTF-8だったりEUCだったり、自動的に識別していました。 重ねてお礼申し上げます。 ありがとうございました。