nagilumと申します。
「10日でおぼえるJSP/サーブレット 入門教室」という、2002年に発売された
ちょっと旧い本で勉強をしています。
下記はその中のJSPのコードで、クライアント(ウェブブラウザ)から受け取った
文字列をハッシュのキーとして検索して、値の内容を表示するものです。
ウェブブラウザから正しい(ハッシュに存在するキー)文字列を入力しても、
ハッシュのキーにヒットしません。
日本語の文字コードの問題のようですが、下記のコードをどのように修正すれば
よいのかわかりません。
すみません、助けてください。
クライアント(ウェブブラウザ)は Windows (Shift_JIS) です。
サーバ(Apache+Tomcat)は Fedora Core 4 (UTF-8) です。
よろしくお願いします。
1 <%@ page contentType="text/html;charset=UTF-8" import="java.util.*,java.io.*" %>
2 <%!
3 public String strEncode( String strVal ) throws UnsupportedEncodingException {
4 if( strVal == null ){ 5 return null;
6 }
7 else {
8 return new String( strVal.getBytes( "ISO-8859-1" ), "JISAutoDetect" );
9 }
10 }
11 %>
12 <html>
13 <head>
14 <title>アドレス帳検索(検索結果)</title>
15 </head>
16 <body>
17 <h1 style="background:#cccccc">アドレス帳検索</h1>
18 <%
19 HashMap hm = new HashMap();
20 hm.put( "輪笠貴子", "女, 0xx-xxx9-1111,横浜市まるばつ町5-18-199" );
21 hm.put( "佐々木健司", "男,04x-231x-xxxx,川崎市まるまる町1-3213" );
22 hm.put( "鳥内都", "女,09x-21xx-xx97,横浜市なになに区5-16" );
23 hm.put( "金崎瑞穂", "女,02x-654x-324x,相模原市なんとか区1-9-21" );
24 String strName = strEncode( request.getParameter( "name" ) );
25 if( hm.containsKey( strName ) ){
26 String strResult = (String)hm.get( strName );
27 StringTokenizer tkn = new StringTokenizer( strResult, "," );
28 %>
29 <dl>
30 <dt style="font-size:14pt;font-weight:bold">
31 <%= strName %>
32 </dt>
33 <dd>
34 <ol>
35 <li><%= tkn.nextToken() %></li>
36 <li><%= tkn.nextToken() %></li>
37 <li><%= tkn.nextToken() %></li>
38 </ol>
39 </dd>
40 </dl>
41 <%
42 }
43 else {
44 %>
45 <div style="color:Red">指定された名前は見つかりませんでした</div>
46 <%
47 }
48 %>
49 </body>
50 </html>
↑きちんと整形したコードをペーストしたのですが、
ブランクが全部削られてしまってとても読みにくくなってます。
ごめんなさい。
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"に変えてみてください。
以上の条件を満たせば正しく動くかと思いますのでご確認頂ければと思います。
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 に変換せよ
ってことでしょうか?
我ながら浅い頭脳で恥ずかしいのですが、解説をお願いできませんでしょうか。
よろしくお願いします。
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/technote …
ARIA9様
お礼が遅くなりました。ごめんなさい。
丁寧に解説をいただき、本当にありがとうございます。
おかげさまで、得心がいきました。
> ということで、今回はクライアントから送出されてくるリクエストデータが
> UTF-8であったが、Windows-31Jと思っていたことが根本的な原因だったと思われます。
そのとおりですね。
件のJSPには encoding を指定していましたが、このJSPにジャンプする元の
HTMLには特定の encoding を指定していませんでした。
なので、きっとデフォルトの Windows-31J だろうと思いこんでしまっていました。
IEというか、世のウェブブラウザは自分が考えていたよりもずっと賢くできて
いるんですね。UTF-8で書かれたHTMLはちゃんとUTF-8として認識しているようです。
IEのポップアップメニューの「エンコード」を使って確認したところ、
ウェブサイトによってUTF-8だったりEUCだったり、自動的に識別していました。
重ねてお礼申し上げます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- HTML・CSS htmltとcssの連携をして画像縮小について 1 2022/11/15 20:32
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- HTML・CSS CSSが上手く反映されないみたいです 2 2022/11/21 16:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perl 文字列検索後に指定フィー...
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
まったく同じファイルのハッシ...
-
重複ファイルを削除したいので...
-
チェックデジットについて
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
画面を強制的に再描画させる方法
-
UWSCの終了の仕方
-
null 参照の例外が実行時に発生...
-
DoEventsが必要な理由について
-
VBのReturnの使い方
-
アクティブセルから、A列最終行...
-
GIFアニメをループさせたくない
-
二次元配列のインデックスについて
-
エクセル関数で1〜12の数字がル...
-
Escキーを押すと、中断する時と...
-
python質問
-
vbscriptでIE自動入力(途中で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
ハッシュのハッシュを実現したい。
-
まったく同じファイルのハッシ...
-
列挙型と連想配列の違いを教え...
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
短いハッシュの作り方
-
英語でのシャープとコメの呼び...
-
ハッシュマーク以降のアドレス取得
-
一意(ユニーク)かつ、ソート...
-
Perlは戻り値で、ハッシュや配...
-
ハッシュリストって単にハッシ...
-
ActivePerl がハングアップ
-
多次元配列から重複を削除
-
mapのポインタ
-
Perlのハッシュ変数のソートに...
-
Perlのサブルーチンの引数に配...
-
文字数の短いユニークなID生成
おすすめ情報