java servlet解码UTF-8不工作

java servlet解码UTF-8不工作,java,servlets,utf-8,Java,Servlets,Utf 8,我正在尝试解码servlet中的encodes字符串,因为它没有被正确解码 但当我尝试使用普通java程序时,它工作得很好 我的代码如下 import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.h

我正在尝试解码servlet中的encodes字符串,因为它没有被正确解码

但当我尝试使用普通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);
    }
}
当我尝试使用servlet时,我得到了

当我运行main方法时,它会正确地将结果显示为

தகவல் வெற்றிகரமாக சேர்க்கப்பட்டது
在my 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(){}
 }
但仍然不起作用


救命啊

如果日志只是记录到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问题。

如果日志记录只是到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问题。

我怀疑请求没有使用UTF-8编码。在筛选器中打印即将到来的请求的字符编码。或者你可以使用像小提琴手这样的工具。如果不是UTF-8,那可能就是问题所在

您正在使用useBodyEncodingForURI,其中说明:

这指定是否应将contentType中指定的编码用于URI查询参数,而不是使用URIEncoding。此设置用于与Tomcat 4.1.x兼容,其中contentType中指定的编码或使用Request.setCharacterEncoding方法显式设置的编码也用于URL中的参数。默认值为false。”


在您的情况下,即使在server.xml中将URIEncoding设置为UTF-8,它也会被contentType.Unset useBodyEncodingForURI中的编码覆盖(如果需要,请修复请求contentType)看看它是如何工作的。

我怀疑该请求没有使用UTF-8编码。请在筛选器中打印即将到来的请求的字符编码。或者您可以使用fiddler之类的工具。如果它不是UTF-8,则可能是问题所在

您正在使用useBodyEncodingForURI,其中说明:

这指定是否应将contentType中指定的编码用于URI查询参数,而不是使用URIEncoding。此设置用于与Tomcat 4.1.x兼容,其中contentType中指定的编码或使用Request.setCharacterEncoding方法显式设置的编码也用于URL中的参数。默认值为false。”


在您的情况下,即使在server.xml中将URIEncoding设置为UTF-8,它也会被contentType.Unset useBodyEncodingForURI中的编码覆盖(如果需要,请修复请求contentType)看看它是如何工作的。

您的代码非常好。问题在于您的控制台打印。windows控制台不支持UTF-8打印


您正在测试的主要方法必须在支持UTF-8打印的java编辑器中。

您的代码非常好。问题在于控制台打印。windows控制台不支持UTF-8打印


您正在测试的主要方法必须在支持UTF-8打印的java编辑器中。

以下是一些观察/评论:

  • 您试图解码的字符串未从请求中提取,因此任何与服务器端编码相关的设置都不会生效
  • 由于本机字符串(
    stringsd=”நல்வரவு“;
    )在源代码中,源代码是使用UTF-8编码编译的,当您独立运行程序时使用UTF-8编码。这将在您尝试打印
    System.getProperty(“file.encoding”)
    的输出时得到确认。这应打印
    UTF-8
  • 要解决您的问题,需要设置系统编码。这可以通过设置JVM参数
    file.encoding
    完成。这可以使用JVM参数中的
    -Dfile.encoding=UTF-8
    完成。这可以在应用服务器的启动批处理文件中设置

  • 以下是一些观察/评论:

  • 您试图解码的字符串未从请求中提取,因此任何与服务器端编码相关的设置都不会生效
  • 由于本机字符串(
    stringsd=”நல்வரவு“;
    )在源代码中,源代码是使用UTF-8编码编译的,当您独立运行程序时使用UTF-8编码。这将在您尝试打印
    System.getProperty(“file.encoding”)
    的输出时得到确认。这应打印
    UTF-8
  • 要解决您的问题,需要设置系统编码。这可以通过设置JVM参数
    file.encoding
    完成。这可以使用JVM参数中的
    -Dfile.encoding=UTF-8
    完成。这可以在应用服务器的启动批处理文件中设置

  • 读取UTF-8数据是一回事,URL编码字符串是另一回事。您指的是这两个数据中的哪一个?换句话说,如何从
    sd
    内部
    doGet()生成
    s
    的值
    ?我已经使用encode程序手动生成了s值。您是否在同一个控制台中检查输出?可能是当您以独立方式运行时,eclipse控制台正确显示UTF-8输出,而web服务器控制台输出不正确?是的,我想您是对的。我正在查看不同的控制台。您能告诉我如何将tomcat控制台设置为打印utf-8流。@premanth,
    System.getProperty(“file.encoding”)的输出是什么
    当从tomcat内部运行,然后作为独立运行时?读取UTF-8数据是一回事,URL编码字符串是另一回事。您指的是这两个中的哪一个?换句话说,如何从
    sd
    内部
    doGet()
    生成
    s的值?我已经使用encode程序manuall生成了s值