各ブラウザの動作を、プロトコルヘッダの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 件のコメント:
コメントを投稿