服务器(Java)到客户端(浏览器)&客户端到服务器的中文乱码以及标签问题解决办法综合

服务器(Java)到客户端(浏览器)&客户端到服务器的中文乱码以及标签问题解决办法综合


0.编码问题

首先出现服务器和客户端都是因为编码的问题,接下来的解决办法基本上都是编码和解码。

然后,说道编码问题,插入一点点题外话。

UTF-8 要注意使用UTF-8,这是一个神奇的编码格式,编码界通用编码格式,虽然UTF-8编码的格式所占的内存大一点,但是放眼现在的内存价格,可以忽略了,内存价格已经是一个古老的问题了。

注意!windows的软件很多软件在进行文本的保存的时候,会默认存储不是UTF-8格式的,像GBK,iso-8859,Unicode编码格式,反正各种各样,大家在使用软件编程的时候,一定要设置一下编码格式,不然以后你还要去转成UTF-8,那时候就很难受了。

在此还是想提一下孤尽老师主导的阿里巴巴Java规范开发手册,不得不说这是一本很好很好的书。我记的得那时候我在云栖社区有看到Java规范手册的问世的时候(当然那时候还是电子版,那时候不是完整的终板),以及后期出了阿里巴巴Java规约插件,当然正版的纸质档读物是必不可少的,说道读物的设计,真的是很完美,小册子形式的设计,不大不小,床头读物刚好(当然,骄傲的说一下,我有老师现场发布会签名版的,嘻嘻)。

回到正题,无论是使用IDE还是Eclipse也好,最好的就是换行符使用unix格式,文字编码使用UTF-8格式,在阿里巴巴Java开发手册中也有写到,下面贴出来。

感觉整本书,还需要我继续学习,之前只是用三天粗糙的看完了,然后考了一张阿里的Java规范手册证书,不过那时候书上的除了单纯的Java简单语法之外的其他都没有学,感觉基本上就是当时纯记忆了,根本就不理解。随着现在为了更好的准备秋季的大四实习,开始慢慢接触服务器、数据库和前台,发现书上写的真的都是智慧的结晶,慢慢理解里面的内容了,在这里也推荐给大家读和学习。

1.服务器向客户端写中文–乱码–解决办法

public class TestCode extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //写的方式2
        PrintWriter writer = response.getWriter();
        writer.write("Java规范手册");
        //写的方式1
        response.getWriter().write("Java规范手册");
    }
}

2.服务器向客户端使用url方式传中文参数–get提交方式–乱码–解决办法

//服务器端
public class TestCode extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String url = URLEncoder.encode("Java规范手册", "UTF-8");
        System.out.println(url);
        //后台输出:Java%E8%A7%84%E8%8C%83%E6%89%8B%E5%86%8C
        url = URLEncoder.encode(url, "UTF-8");
        System.out.println(url);
        //后台输出:Java%25E8%25A7%2584%25E8%258C%2583%25E6%2589%258B%25E5%2586%258C
        response.sendRedirect("index.jsp?parameter="+url);
    }
}

//客户端
<%=URLDecoder.decode(request.getParameter("parameter"),"UTF-8")%>

此处需要注意这里经过了两次编码,因为在浏览器取的时候,request.getParameter()会默认解码一次,所以我们需要两次编码和一次解码(实际是两次解码,因为有默认的一次解码)

3.客户端向服务器使用url方式传中文参数-get提交方式–乱码-解决办法

//客户端
<a href="<%=request.getContextPath() %>/testCode?method=<%=URLEncoder.encode(URLEncoder.encode("java规范手册", "UTF-8"), "UTF-8") %>">点我呀</a>

//服务器端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println(request.getParameter("method"));
    System.out.println(URLDecoder.decode(request.getParameter("method"),"UTF-8"));

}

同服务器端向客户端传的原理一样,反过来进行就ok了,在客户端进行两次编码,在服务器端进行一次解码(外加一次request.getParameter()默认解码一次),就可以了

扫描二维码关注公众号,回复: 1025532 查看本文章

4.客户端向服务器使用form表单方式传中文参数-post提交方式–乱码-解决办法

//客户端,使用form表进行post方式的提交
<form action="testCode" method="post"> 
    name:<input type="text" name="name">
    <input type="submit" value="提交">
</form>

//服务器,获取前端通过post方式提交的参数(parmeter的中文意思就是参数,attribute是属性的意思)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    System.out.println(request.getParameter("name"));
}

5.服务端向客户端写html标签–显示–解决办法

//正确使用方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().write("<hr>");
    PrintWriter write = response.getWriter();
    write.write("<h4>212</h4>");
}
//错误使用方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.getWriter().write("<hr>");
    PrintWriter write = response.getWriter();
    write.write("<h4>212</h4>");
}

有的时候想写html标签到浏览器的时候,不要误认为request.setContentType()和[request.setCharacterEncoding()+response.setCharacterEncoding()]是等价的,它们不一样。前者是像浏览器报告使用编码格式,后者是设置属性的编码格式(emm..好像是这么回事,我自己也不知道request.setsetCharacterEncoding()有什么用,求大家普及一下小白)。

猜你喜欢

转载自blog.csdn.net/XiaHeShun/article/details/80375022