javaweb中的中文乱码问题的疑惑,请大牛们指教一下

在这里我对在我学习中了解到的知识点的认识一些我的疑惑写下来,希望能得到各位大牛们的解答。代码实在学习过程中抄下来和改编的。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;

/*  这里可以很好的理解编码问题,中文乱码问题
 *  浏览器编码,tomcat服务器的request,response编码,要好好区分一下
 */

public class Download2 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //直接设置response,request的编码好像行不通啊,
    //问题一:response.setContentType("text/html;charset=UTF-8")只适在writer中使用吗?设置的是response的编码吗? 
        //response.setContentType("text/html;charset=UTF-8");
        //问题二:这里只能解决post提交时的中文乱码问题
        //request.setCharacterEncoding("UTF-8");
    //这里的filename是有request获得的,其编码是ISO8859-1编码
    String filename = request.getParameter("filename");
    //这里是将ISO8859-1编码转换为utf-8,是为了对中文进行编码
    filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");

    //注释掉匹配浏览其也可以了,然后就无法在浏览其上识别中文名字
    String agent = request.getHeader("User-Agent");
    String filenameEncoder = "";
    if (agent.contains("MSIE")) {
        // IE浏览器
        filenameEncoder = URLEncoder.encode(filename, "utf-8");
        filenameEncoder = filenameEncoder.replace("+", " ");
    } else if (agent.contains("Firefox")) {
        // 火狐浏览器
        BASE64Encoder base64Encoder = new BASE64Encoder();
        filenameEncoder = "=?utf-8?B?"
                + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    } else {
        // 其它浏览器
        filenameEncoder = URLEncoder.encode(filename, "utf-8");             
    }

    //这里是获取后缀名,为引文所以影响不大
    response.setContentType(this.getServletContext().getMimeType(filename));
    //response.setContentType(this.getServletContext().getMimeType(filenameEncoder));

    //又变成了浏览器的编码识别了?  这里是在if,else 中更改了编码。
    //这里是要求按照浏览器的编码来进行解码的,所以匹配浏览其的步骤是为了在这里显示出中文名字
    response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);

    //这里一定要用filename,解码是通过项目解码的,filenameEncoder是进行了编码改编的
    //String path = this.getServletContext().getRealPath("download/"+filenameEncoder);
    String path = this.getServletContext().getRealPath("download/"+filename);       
    InputStream in = new FileInputStream(path);
    ServletOutputStream out = response.getOutputStream();
    int len = 0;
    byte [] buffer = new byte[1024];
    while((len=in.read(buffer))>0) {
        out.write(buffer, 0, len);
    }
    in.close();

}

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

问题3:
为什么我直接将问题一中的代码 request.setCharacterEncoding(“UTF-8”); 解注释来设置编码集,然后再删掉那段对filenameEncoder的编码匹配过程,无法实现下载文件名称显示中文呢?及改编过后代码如下:

public class Download2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    //这里不是直接就更改了编码方式吗? 更改了什么的编码方式?
    response.setContentType("text/html;charset=UTF-8");

    //对fliename改变编码方式,从ISO8859-1变成UTF-8
    filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");
    response.setContentType(this.getServletContext().getMimeType(filename));
    //这里的filename不是已经用utf-8进行编码的吗,为什么识别不了其中文呢,同时在setContentType方法中不是已经将编码设置成utf-8的形式了吗,应该可以识别的。
    response.setHeader("Content-Disposition", "attachment;filename="+filename);
    String path = this.getServletContext().getRealPath("download/"+filename);       
    InputStream in = new FileInputStream(path);
    ServletOutputStream out = response.getOutputStream();
    int len = 0;
    byte [] buffer = new byte[1024];
    while((len=in.read(buffer))>0) {
        out.write(buffer, 0, len);
    }
    in.close();

}

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

恳请大家帮我解答一下!谢谢

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值