首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java servlet解码UTF-8不起作用

java servlet解码UTF-8不起作用
EN

Stack Overflow用户
提问于 2013-08-19 16:23:05
回答 4查看 1K关注 0票数 1

我正在尝试解码servlet中的编码字符串,它没有被正确解码。

但是当我用普通的java程序做同样的尝试时,它工作得很好。

我的代码如下...

代码语言:javascript
复制
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方法时,它正确地将结果显示为....

代码语言:javascript
复制
தகவல் வெற்றிகரமாக சேர்க்கப்பட்டது

在我的server.xml中,我添加了

代码语言:javascript
复制
URIEncoding="UTF-8" useBodyEncodingForURI="true"

我添加了一个过滤器来处理所有请求,如下所示

代码语言:javascript
复制
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(){}
 }

但还是不能工作

帮帮忙!

EN

回答 4

Stack Overflow用户

发布于 2013-08-19 16:49:18

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

您使用的是useBodyEncodingForURI,它说:

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-19 16:29:59

如果日志记录只是转到log4j,那么它可能正在工作,而log4j需要一些配置

在log4j.appendder.rollingFile.coding=UTF-8中

如果在我的代码中有

代码语言:javascript
复制
        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问题。

票数 0
EN

Stack Overflow用户

发布于 2013-08-19 17:08:49

您的代码是完全正确的。问题出在您的控制台打印上。windows控制台不支持UTF-8打印。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18309336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档