HTTP GET 要求を介してアップストリーム システムからデータを受信する Java サーブレットがあります。このリクエストには、「text」という名前のパラメータが含まれています。アップストリーム システムがこのパラメータを次のように設定した場合:
TEST3 please ignore:
アップストリーム システムのログには次のように表示されます。
00 54 00 45 00 53 00 54 00 33 00 20 00 70 00 6c //TEST3 pl
00 65 00 61 00 73 00 65 00 20 00 69 00 67 00 6e //ease ign
00 6f 00 72 00 65 00 3a //ore:
( // コメントは実際にはログに表示されません)
私のサーブレットでは、このパラメーターを次のように読み取ります。
String text = request.getParameter("text");
の値をtext
コンソールに出力すると、次のように表示されます。
T E S T 3 p l e a s e i g n o r e :
text
デバッガーでの値を調べると、次のように表示されます。
\u000T\u000E\u000S\u000T\u0003\u0000 \u000p\u000l\u000e\u000a\u000s\u000e\u0000
\u000i\u000g\u000n\u000o\u000r\u000e\u000:
そのため、文字エンコーディングに問題があるようです。上流のシステムは UTF-16 を使用することになっています。私の推測では、サーブレットは UTF-8 を想定しているため、本来あるべき文字数の 2 倍を読み取っています。メッセージ「TEST3 無視してください:」の場合、各文字の最初のバイトは00
. これは、サーブレットによって読み取られるときにスペースとして解釈されます。これは、メッセージがサーブレットによってログに記録されるときに各文字の前に表示されるスペースを説明しています。
明らかに、私の目標は、リクエストパラメーターを読んだときに「TEST3を無視してください:」というメッセージを取得することですtext
。リクエストパラメーターの文字エンコーディングを指定することでこれを達成できると思いますが、これを行う方法がわかりません。