Servlet技术中的中文乱码问题

引言

中国人编程确实不容易,处处存在乱码问题。Servlet技术中的乱码问题,主要是请求与响应数据的乱码问题,下面对其中各种乱码问题进行讨论。

提交中文表单

一般我们在Servlet中获取表单数据时,会出现乱码。问题的原因是在我们获取数据时没有使用正确的码表编码。
example: String name = request.getParameter("username");
这是因为request在获取数据时,查的码表是ISO8859-1(没办法,技术是老外的),而浏览器在提交数据时使用的并不是这个码表,于是就出现中文乱码问题。

可是这有分为两种情况来解决:
* 对于post方式提交的表单:
我们可以根据浏览器提交时的码表来设置request的码表,以获取我们想要的数据:
request.setCharacterEncoding("UTF-8");
* 对于get方式提交的表单数据(或者直接通过URL带过来的参数)
这种情况,我们只能手动解决(即反向查表):
String name = new String(username.getBytes("iso8859-1"), "utf-8");

文件下载中的乱码问题

如果我们将下载文件的名称设置为中文,能就一定要解决乱码问题了,否则别人看到的下载文件名将是一串乱码。
解决办法,就是对文件名进行URL编码:

String filename =  "随心";
/*设置响应内容为 文件下载*/
response.setHeader("content-disposition", "attachment; filename="+URLEncoder.encode(filename, "UTF-8"));

什么是URL编码(其实我也不是很清楚)
应该是:对于URL中的中文,向服务器请求资源时,必须用Base64算法进行编码编过之后是这个样子: http://localhost:8080:/Demo?username=%E4%BD%A0 %E5%A5%BD%
这样服务器应该才能正确知道请求的资源到底是什么(其实我们在get方式提交数据时,浏览器会将中文字符自动进行>URL编码)

response的乱码问题

同样,我们在使用response向浏览器输出中文数据时一样会有乱码问题,原因和request差不多,是因为response在对数据进行编码时采用的也不是我们理想的表,至于是什么你想想就知道了,因此我们应把response的码表,设置成和浏览器解析数据的码表相同,才可以看到想要的内容。

在向浏览器打数据之前,添上这两行代码,就搞定了:

response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

过滤器+装饰设计模式 —> 一劳永逸的解决办法

乱码问题真心烦!!每次都要解决,反正我是受不了!!!
如果会过滤器技术,那解决一次,全站就OK了,这里只把代码贴出来,至于原理,后面再探:

ublic class CharacterEncodingFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        request.setCharacterEncoding("UTF-8");  //post  get
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        chain.doFilter(new MyRequest(request), response);  
    }


    class MyRequest extends HttpServletRequestWrapper{

        private HttpServletRequest request;
        public MyRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        @Override
        public String getParameter(String name) {

            String value = this.request.getParameter(name);
            if(!request.getMethod().equalsIgnoreCase("get")){
                return value;
            }

            if(value==null){
                return null;
            }

            try {
                return value = new String(value.getBytes("iso8859-1"),request.getCharacterEncoding());
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }

        }

    }

我记得乱码问题有很多,他日再想起来就回来补充!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值