TOMCAT 下中文乱码问题解决集锦/Java/JSP中文乱码问题解决

如何解决Tomcat下中文乱码问题?

http://www.javaeye.com/topic/251743

现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。

     1)JSP页面中显示中文乱码

     在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>

     2)表单提交乱码   

     表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
    (1)POST处理
    对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:

  1. package example.util;  
  2.       
  3.     import java.io.IOException;  
  4.       
  5.     import javax.servlet.Filter;  
  6.     import javax.servlet.FilterChain;  
  7.     import javax.servlet.FilterConfig;  
  8.     import javax.servlet.ServletException;  
  9.     import javax.servlet.ServletRequest;  
  10.     import javax.servlet.ServletResponse;  
  11.       
  12.     public class SetCharacterEncodingFilter implements Filter {  
  13.       
  14.        protected String encoding = null;  
  15.       
  16.        protected FilterConfig filterConfig = null;  
  17.       
  18.        protected boolean ignore = true;  
  19.       
  20.     
  21.      public void destroy() {  
  22.       
  23.       this.encoding = null;  
  24.       this.filterConfig = null;  
  25.       
  26.      }  
  27.       
  28.      public void doFilter(ServletRequest request, ServletResponse response,  
  29.       <strong><span style="color: rgb(255, 0, 0);"> FilterChain chain) throws IOException, ServletException {  
  30.       
  31.           if (ignore || (request.getCharacterEncoding() == null)) {  
  32.        String encoding = selectEncoding(request);  
  33.        if (encoding != null) {  
  34.         request.setCharacterEncoding(encoding);  
  35.        }  
  36.       }</span>  
  37. </strong>      
  38.       // Pass control on to the next filter  
  39.       chain.doFilter(request, response);  
  40.       
  41.      }  
  42.     public void init(FilterConfig filterConfig) throws ServletException {  
  43.       
  44.       this.filterConfig = filterConfig;  
  45.       this.encoding = filterConfig.getInitParameter("encoding");  
  46.       String value = filterConfig.getInitParameter("ignore");  
  47.       if (value == null) {  
  48.        this.ignore = true;  
  49.       } else if (value.equalsIgnoreCase("true")) {  
  50.        this.ignore = true;  
  51.       } else if (value.equalsIgnoreCase("yes")) {  
  52.        this.ignore = true;  
  53.       } else {  
  54.        this.ignore = false;  
  55.       }  
  56.       
  57.      }  
  58.       
  59.      protected String selectEncoding(ServletRequest request) {  
  60.       
  61.       return (this.encoding);  
  62.       
  63.      }  
  64.       
  65.     }  

 

    文中红色的代码即为处理乱码的代码。
      web.xml文件加入过滤器

 

Xml代码
  1. <filter>  
  2.     <filter-name>Encoding</filter-name>  
  3.     <filter-class>  
  4.             example.util.SetCharacterEncodingFilter  
  5.      </filter-class>  
  6.     <init-param>  
  7.    <param-name>encoding</param-name>  
  8.    <param-value>gbk</param-value>  
  9.    <!--gbk或者gb2312或者utf-8-->  
  10.   </init-param>  
  11.   <init-param>  
  12.    <param-name>ignore</param-name>  
  13.    <param-value>true</param-value>  
  14.   </init-param>  
  15.  </filter>  
Xml代码
  1. <filter-mapping>  
  2.   <filter-name>Encoding</filter-name>  
  3.   <servlet-name>/*</servlet-name>  
  4.  </filter-mapping>  

(2) Get方法的处理
 tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
 打开<tomcat_home>/conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
  

Java代码
  1. <Connector port="8080" maxHttpHeaderSize="8192"  
  2.                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
  3.                enableLookups="false" redirectPort="8443" acceptCount="100"  
  4.                connectionTimeout="20000" disableUploadTimeout="true" <span style="color: rgb(255, 0, 0);">URIEncoding="GBK"</span> />  

    * 注意修改后重新启动tomcat才能起作用。

 

配置Tomcat 中文字符集问题
觉得还是要写出来,免的要用的时候遍地找牙耽搁时间.
文件:
%Tomcat_home%/conf/web.xml
修改位置:
<Connector port="8080" maxThreads="150" minSpareThreads="25"
.........
在该Connector标签中添加项URIEncoding="GBK" useBodyEncodingForURI="true"
保存重启服务即可.

 

 

 

 

java web应用文件下载(包括中文文件名乱码处理)

url: http://blog.csdn.net/lovingprince/archive/2008/07/18/2671580.aspx

Java web下载文件功能的确很简单。如下代码片段String fileName ="....";
response.setHeader("Content-disposition","attachment; filename="+fileName);
//response.setContentType("application/ms-word");

BufferedInputStream bis = null;
BufferedOutputStream bos = null;
    try {
        bis = new BufferedInputStream(new FileInputStream(getServletContext().getRealPath("" + fileName)));
        bos = new BufferedOutputStream(response.getOutputStream());

        byte[] buff = new byte[2048];
        int bytesRead;

        while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
            bos.write(buff,0,bytesRead);
        }

    } catch(final IOException e) {
        System.out.println ( "IOException." + e );

    } finally {
        if (bis != null)
            bis.close();
        if (bos != null)
            bos.close();
    }

如上所示,已经可以完成下载的功能。不过如果我们使用中文文件名,那么这段代码便会出错,解决办法有多种方式,如下:

 

 第一种: 设置  response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));这里将文件名编码成UTF-8的格式,就不会出现URL出错了。IE6下注意中文文字不能超过超过17个。

 

 第二种:设置response.setHeader( "Content-Disposition", "attachment;filename="  + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );将中文名编码为ISO8859-1的方式。不过该编码只支持简体中文.

按照上诉方式,可以综合一下两种方式解决绝大部分中文问题。

 fileName = URLEncoder.encode(fileNameSrc,"UTF-8");

if(fileName.length()>150)//解决IE 6.0 bug

      fileName=new String(fileNameSrc.getBytes("GBK"),"ISO-8859-1");

response.setHeader( "Content-Disposition", "attachment;filename="  + fileName);

 

 

 

 

java实现文件下载并解决中文文件名乱码问题
2009-07-07 19:07

 

/**
* 下载文件
* @param mapping
* @param form
* @param request
* @param response
* @return
* @throws Exception
*/
public void downLoadFile(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
   //得到该文件在数据库中的信息
   int fileId = Integer.parseInt(request.getParameter("fileId").toString());
   FileInfo file = fileInfoBiz.getFileInfoByFileId(fileId);
   try{
    String filepath = file.getFilePath()+"//"+file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件路径
    String filename = file.getFileName()+"."+file.getFileTypeInfo().getFileTypeSuffix();//需要下载的文件名字
    //解决中文文件名乱码问题
    if(request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0)
     filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
    else if(request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0)
     filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器

    /**
    * 如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等
    * 文件下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打
    * 开,有些也可以正常打开。同时response.reset()这种方式也能清空缓冲区, 防止页面中的空
    * 行等输出到下载内容里去
    */
    response.reset();
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=/"" + filename + "/"");
    response.setHeader("Connection", "close");

    ServletOutputStream sos = response.getOutputStream();
    FileInputStream fis = null;
    File d = new File(filepath);
    if (d.exists()){
     fis = new FileInputStream(filepath);
     byte b[] = new byte[1000]; //输入流的读取速率
     int j;
     while ((j = fis.read(b)) != -1){
      try{
       sos.write(b, 0, j);
      }
      catch (IOException exp){
       MyLog.error("文件流写入错误", exp);
      }
     }
     fis.close();
     sos.flush();
     sos.close();
    }
   }catch(Exception e){
            MyLog.error("下载文件出错", e);
            //return mapping.findForward("page_error");
   }
   //return toFileMain(mapping, form, request, response);
}

 

 

 

以下载方式导出xls文件 赠送解决中文文件名问题

url: http://www.javaeye.com/topic/742753

最近需要一个功能 点击导出按钮,导出一个xls文件 用户 指定保存路径。 用的是 jxl api

先上代码:

Java代码 复制代码
  1. public String xls() {   
  2.         if (day == null) {   
  3.             this.pagination = propertyMng.findSumList(pageNo, getCookieCount());   
  4.         } else {   
  5.             if (day.equals("")) {   
  6.                 DateFormat df = new SimpleDateFormat("yyyy-MM-dd");   
  7.                 day = df.format(new Date());   
  8.             }   
  9.             this.pagination = propertyMng.findListByDay(day, pageNo,   
  10.                     getCookieCount());   
  11.         }  
Java代码 复制代码
  1. //上面是我自己的业务逻辑  
Java代码 复制代码
  1.     HttpServletResponse response = ServletActionContext.getResponse();   
  2.     String fileName = "强大.xls";   
  3.     try {   
  4.         fileName = new String(fileName.getBytes(), "iso8859-1");//解决中文 文件名问题   
  5.     } catch (UnsupportedEncodingException e1) {   
  6.         e1.printStackTrace();   
  7.     }   
  8.     response.setHeader("content-disposition""attachment; filename="  
  9.             + fileName);// 设定输出文件头   
  10.     response.setContentType("application/msexcel");// 定义输出类型   
  11.     getInputStream(response);   
  12.     return null;   
  13. }  

 

Java代码 复制代码
  1. public void getInputStream(HttpServletResponse response) {   
  2.         try {   
  3.             OutputStream os = response.getOutputStream();   
  4.             WritableWorkbook wwb = Workbook.createWorkbook(os);   
  5.             WritableSheet ws = wwb.createSheet("道具排行"0);   
  6.             WritableFont wfc = new WritableFont(WritableFont.ARIAL, 20,   
  7.                     WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE,   
  8.                     Colour.GREEN);   
  9.             WritableCellFormat wcfFC = new WritableCellFormat(wfc);   
  10.             Label label1 = new Label(00"道具", wcfFC);   
  11.             ws.addCell(label1);   
  12.             Label label2 = new Label(10"数量", wcfFC);   
  13.             ws.addCell(label2);  
Java代码 复制代码
  1. //业务逻辑 封装 Label    
  2.             List<PropertyUseInfoPOJO> list = pagination.getList();   
  3.             int i = 1;   
  4.             for (PropertyUseInfoPOJO pojo : list) {   
  5.                 Label name = new Label(0, i, pojo.getName());   
  6.                 ws.addCell(name);   
  7.                 Label num = new Label(1, i, pojo.getNum());   
  8.                 ws.addCell(num);   
  9.                 i++;   
  10.             }  
Java代码 复制代码
  1. //关闭操作   
  2.             wwb.write();   
  3.             wwb.close();   
  4.             os.close();   
  5.         } catch (IOException e) {   
  6.             // TODO Auto-generated catch block   
  7.             e.printStackTrace();   
  8.         } catch (RowsExceededException e) {   
  9.             // TODO Auto-generated catch block   
  10.             e.printStackTrace();   
  11.         } catch (WriteException e) {   
  12.             // TODO Auto-generated catch block   
  13.             e.printStackTrace();   
  14.         }   
  15.     }  

 感觉挺简单的。 构建输出流 主要是 Label 对象 相当于 单元格

WritableCellFormat 对象 相当于设置样式

往 WritableSheet 添加 Label  就构建了一个xls结构

点击button 开始下载文件 无转向页面

下面是截图 ,简单清晰明了。~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值