【问题标题】:java servlet decoding UTF-8 not workingjava servlet解码UTF-8不起作用
【发布时间】:2013-08-19 08:23:04
【问题描述】:

我正在尝试解码 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!!!!

【问题讨论】:

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

标签: java servlets utf-8


【解决方案1】:

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

你正在使用 useBodyEncodingForURI 说:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • OP 正在控制台上打印。
    • 我没有在我的应用程序中使用 log4j 我正在尝试使用基本的 servlet 程序。
    • So not log4j Output is OK via meyerweb.com/eric/tools/dencoder 他们是同一台机器吗?
    • @user2310289:是的,我正在同一台机器上运行程序
    • @user2310289 :通过给定的 url 和 main 方法输出正常,但 servlet 有问题
    【解决方案3】:

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

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

    【讨论】:

    • 如何让tomcat控制台打印UTF-8字符
    • 你不能。因为你的 tomcat 控制台是一个 windows 控制台。
    • 将您的输出定向到文本文件(记事本)。
    • 或输出到浏览器。 即: response.getWriter().print();
    【解决方案4】:

    这里有一些观察/cmets:

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

    【讨论】:

      猜你喜欢
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 2013-04-21
      相关资源
      最近更新 更多