2010年5月3日月曜日

Servletでのパラメータ解析(2)

「Servletでのパラメータ解析について(1)」では、ブラウザから「http://localhost:8080/TestSevlet/Test?p1=あいう」などのように直接URL指定を行った場合に、後続のパラメータの処理がブラウザによって異なることをお話しました。
各ブラウザの動作を、プロトコルヘッダのUser-Agentの特定のパラメータから引き出せないか、Webなどで確認したところ、このUser-Agentは、各メーカーが勝手に定義しており定義などないようです。ただし、各ブラウザメーカーともに、他社のブラウザと同等の機能を提供したいので、あまり、突飛なUser-Agentは存在していないようです。
したがって、User-Agentからブラウザの種別を判別して、String命令で各ブラウザにあわせて変換する文字コードを個別に実装するしかなさそうです。

なお、本日、Operaブラウザでの動作を確認しました。すると「http://localhost:8080/TestSevlet/Test?p1=あいう」などと指定するとChromeや他社ブラウザとも異なり、JISコードで展開しているようです。
例えば、上の例をOperaブラウザから入力すると
「http://localhost:8080/TestSevlet/Test?p1=%1B$B$%22$$$&%1B(B」と展開れます。文字列の最初にある「%1B$B」は、これから2バイトの漢字を開始するための指示、最後の「%1B(B」は、2バイト漢字が終了したことを示しています。途中も文字列は、JIS漢字コードとなります。
したがって、OperaブラウザからサーブレットにGetメソッドが送信された場合には、

    String p = req.getParameter("p1");
    v = new String(p.getBytes("iso-8859-1"),"iso-2022-jp");
    
と処理する必要があります。

※ これは、Operaのバグと思われますが、上記の仕様だと、上のp1パラメータとして「あいう」などと入力した例を見てください。展開されたURLは次のようになっています。
   「http://localhost:8080/TestSevlet/Test?p1=%1B$B$%22$$$&%1B(B
このURLでは、パラメータの途中に「&」が現れています。このため、Tomcatでは、「&」は、パラメータ指定の終了を示すので「あいう」のパラメータ値をサーブレットに渡すことは不可能となってしまいます。

なお、いままでの話を整理すると、

① User_Agentから、呼び出しブラウザがChromeだったら、
    String p = req.getParameter("p1");
    v = new String(p.getBytes("iso-8859-1"),"UTF-8");
としてパラメータ値を取り出す。

② User_Agentから、呼び出しブラウザがOperaだったら、
    String p = req.getParameter("p1");
    v = new String(p.getBytes("iso-8859-1"),"iso-2022-jp");
としてパラメータ値を取り出す。

③ それ以外だったら、
    String p = req.getParameter("p1");
    v = new String(p.getBytes("iso-8859-1"),"Windows-31J");
としてパラメータ値を取り出す。

となります。ただし、Operaのようにパラメータの日本語処理で問題が発生することも想定されますので、パラメータは極力英語とすべきでしょう。

0 件のコメント:

コメントを投稿