1

サーブレットでエンコード文字列をデコードしようとしていますが、正しくデコードされません。

しかし、通常のJavaプログラムで同じことをしようとすると、正常に動作します。

私のコードは以下の通りです....

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class testsetrv extends HttpServlet 
{
    public void doGet(HttpServletRequest req,HttpServletResponse res)
    {
        String sd="நல்வரவு";
        String s="%E0%AE%A4%E0%AE%95%E0%AE%B5%E0%AE%B2%E0%AF%8D%20%E0%AE%B5%E0%AF%86%E0%AE%B1%E0%AF%8D%E0%AE%B1%E0%AE%BF%E0%AE%95%E0%AE%B0%E0%AE%AE%E0%AE%BE%E0%AE%95%20%E0%AE%9A%E0%AF%87%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A4%E0%AF%81";
    try {
        decode(s);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();}
    }
    public void decode(String a) throws UnsupportedEncodingException
    {
        String s=URLDecoder.decode(a, "UTF-8");
        System.out.println(s);
    }
    public static void main(String a[]) throws UnsupportedEncodingException
    {
        String sd="நல்வரவு";
        String s="%E0%AE%A4%E0%AE%95%E0%AE%B5%E0%AE%B2%E0%AF%8D%20%E0%AE%B5%E0%AF%86%E0%AE%B1%E0%AF%8D%E0%AE%B1%E0%AE%BF%E0%AE%95%E0%AE%B0%E0%AE%AE%E0%AE%BE%E0%AE%95%20%E0%AE%9A%E0%AF%87%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A4%E0%AF%81";
        testsetrv f=new testsetrv();
        f.decode(s);
    }
}

サーブレットを試してみると、??????

main メソッドを実行すると、結果が ... として正しく表示されます。

தகவல் வெற்றிகரமாக சேர்க்கப்பட்டது

私のserver.xmlに追加しました

URIEncoding="UTF-8" useBodyEncodingForURI="true"

以下のようにすべてのリクエストを処理するフィルターを追加しました

public class UTFFilter implements Filter
 {
 private String encoding;

 public void init(FilterConfig config) throws ServletException
 {
  encoding = config.getInitParameter("requestEncoding");

  if( encoding==null ) encoding="UTF-8";
 }

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain       next)
 throws IOException, ServletException
 {
  // Respect the client-specified character encoding
  // (see HTTP specification section 3.4.1)
     System.out.println("asdasgadsgasdgasdgasdgsadgasgasdgsdgsgdsgsdg");
  if(null == request.getCharacterEncoding())
    request.setCharacterEncoding(encoding);


  /**
* Set the default response content type and encoding
*/
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");


  next.doFilter(request, response);
 }

  public void destroy(){}
 }

しかし、まだ機能していません

PLZを助けて!!!!!

4

4 に答える 4

1

リクエストが UTF-8 でエンコードされていないと思います。フィルタに来るリクエストの文字エンコーディングを出力します。または、フィドラーのようなツールを使用できます。UTF-8 でない場合、それが問題である可能性があります。

次のような useBodyEncodingForURI を使用しています。

「これは、URIEncoding を使用する代わりに、contentType で指定されたエンコーディングを URI クエリ パラメータに使用する必要があるかどうかを指定します。この設定は、Tomcat 4.1.x との互換性のために存在します。ここでは、contentType でエンコーディングが指定されているか、Request.setCharacterEncoding を使用して明示的に設定されています。メソッドは URL からのパラメータにも使用されました。デフォルト値は false です。」

あなたの場合、server.xml で URIEncoding を UTF-8 に設定しても、contentType に存在するエンコーディングによってオーバーライドされます。useBodyEncodingForURI の設定を解除し (必要に応じて、リクエストの contentType を修正し)、それがどのように機能するかを確認します。

于 2013-08-19T08:49:17.803 に答える
0

あなたのコードは完全に問題ありません。問題はコンソールの印刷にあります。Windows コンソールはUTF-8印刷をサポートしていません。

テストするメインメソッドは、 UTF-8印刷をサポートするJava エディター内にある必要があります。

于 2013-08-19T09:08:49.473 に答える
0

ここにいくつかの観察/コメントがあります:

  1. デコードしようとしている文字列はリクエストから取得されないため、サーバー側のエンコード関連の設定は無効になります。
  2. ソース コード内のネイティブ文字列 ( String sd="நல்வரவு";) のため、ソース コードは、プログラムをスタンドアロンとして実行するときに使用されるエンコーディング UTF-8 でコンパイルされます。これは、 の出力を印刷しようとすると確認されますSystem.getProperty("file.encoding")。これは印刷されるはずUTF-8です。
  3. 問題を解決するには、システム エンコーディングを設定する必要があります。これは、JVM パラメータを設定することで実行できますfile.encoding。これは-Dfile.encoding=UTF-8、JVM パラメータを使用して実行できます。これは、アプリ サーバーの起動バッチ ファイルで設定できます。
于 2013-08-19T09:45:29.950 に答える
0

ロギングがlog4jにのみ行われる場合、おそらくそれは機能しており、log4jにはいくつかの構成が必要です

log4j.appender.rollingFile.encoding=UTF-8 のように

私のコードにある場合

        String s="%E0%AE%A4%E0%AE%95%E0%AE%B5%E0%AE%B2%E0%AF%8D%20%E0%AE%B5%E0%AF%86%E0%AE%B1%E0%AF%8D%E0%AE%B1%E0%AE%BF%E0%AE%95%E0%AE%B0%E0%AE%AE%E0%AE%BE%E0%AE%95%20%E0%AE%9A%E0%AF%87%E0%AE%B0%E0%AF%8D%E0%AE%95%E0%AF%8D%E0%AE%95%E0%AE%AA%E0%AF%8D%E0%AE%AA%E0%AE%9F%E0%AF%8D%E0%AE%9F%E0%AE%A4%E0%AF%81";
    try {
    String b = URLDecoder.decode(s, "UTF-8");
    log.debug(b);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }   

次に、文字列 b は正しいですが、その印刷はそうではありません。私の場合、SYSOUTの問題です。

于 2013-08-19T08:29:59.433 に答える