java servlet解码UTF-8无法正常工作

时间:2013-08-19 08:23:05

标签: java servlets utf-8

我尝试解码servlet中的编码字符串,但是没有正确解码。

但是当我尝试使用普通的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方法时,它正确显示结果为......

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

在我的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 个答案:

答案 0 :(得分:1)

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

您正在使用useBodyEncodingForURI,其中包含:

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

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

答案 1 :(得分: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问题。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这里有一些观察/评论:

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