11

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。リクエストパラメーターの文字エンコーディングを指定することでこれを達成できると思いますが、これを行う方法がわかりません。

4

3 に答える 3

9

このように使用します

new String(req.getParameter("<my request value>").getBytes("ISO-8859-1"),"UTF-8")
于 2014-01-24T12:02:50.793 に答える
2

これにはフィルターを使用してみてください

public class CustomCharacterEncodingFilter implements Filter {

    public void init(FilterConfig config) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                                                       throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }

これにより、アプリケーション全体のエンコーディング権限が設定されます

于 2012-06-19T11:57:14.570 に答える
1

UTF-16LE(リトルエンディアン)エンコーディングでエンコードされたようです。文字列を正常に出力するクラスは次のとおりです。

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;

public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
            String hex = "00 54 00 45 00 53 00 54 00 33 00 20 00 70 00 6c"  +
                            "00 65 00 61 00 73 00 65 00 20 00 69 00 67 00 6e" +
                           "00 6f 00 72 00 65 00 3a"; // + " 00";
            System.out.println(new String(new BigInteger(hex.replaceAll(" ", ""), 16).toByteArray(), "UTF-16LE"));
    }
}

出力:

TEST3 please ignore?

入力に2つのゼロが追加された出力

TEST3 please ignore:

アップデート

これをあなたと一緒に機能させるには、次のServletことを試すことができます。

  String value = request.getParameter("text");
  try {
      value = new String(value.getBytes(), "UTF-16LE");
  } catch(java.io.UnsupportedEncodingException ex) {}

アップデート

次のリンクを参照してください、それは生成されたヘクスが実際にあることを確認しますUTF-16LE

于 2012-06-19T11:49:31.717 に答える