最近学长分配了一个小任务,让做个微信公众号,想想就是一个servlet就够了,就开始做吧,结果不做没发现,一做发现问题太多了。 其中问题最大的就是中文乱码问题。

和学长研究了一下午都没找到具体什么地方出的问题,各种百度,什么方法都尝试过了,结果都解决不了。

甚至怕由于jdk的io不对又重新从官网下载了jdk。真心无语了!

最后无奈,我脱离了idea,试了试eclipse,然后发现乱码问题竟然神奇的解决啦!

想想eclipse绝对比idea高明不到那去啊,凭什么idea就不行?

最后发现错的很无语!

不过还好,这一次错算是长了很多经验,对于乱码的问题认识又深刻了点吧。

服务器端

我的错误的主要在这, idea默认的文件编码是gbk,而项目编码是utf-8, 我设置的全部编码都是utf-8,在保存文件的时候编码就相当于错了。

总的来说,希望对于使用idea的用户提个醒吧,不要像我迷茫这么长时间。

以上主要是系统设置的编码原因,还有很多是软件设置的原因。

1
2
3
4
5
6
7
8
//这个是设置的请求的方式,将请求的以utf-8的方式读取
request.setCharacterEncoding("utf-8");
//这个是设置的恢复的方式,仅仅针对post有效
response.setCharacterEncoding("utf-8");
//这个是设置的contenttype,感觉跟setCharacterEncoding差不多
response.setContentType("text/html;charset=utf-8");
//这个是设置的http头,主要是针对浏览器用的
response.setHeader();

总的来说,再doPost方法使用以上的几个差不多就能够将乱码问题解决了,不过还有可以注意的地方。

在查询资料的时候发现使用ServletOutputStream输出不会受到编码的影响,没有具体尝试,流是字节方式,应该会比writer字符编码处理的好吧。

希望有大神可以说一说。

还发现有说适应filter过滤的,如果本身文件编码就有问题,过滤也不行,不过对于其他情况或许可以解决。

过滤的部分代码如下

什么情况,总是自动加上html符号,看的时候注意无视她

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package wechat
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
@WebFilter(filterName = "FilterMain")
public class FilterMain implements Filter {
    private String encoding;
    public void destroy() {
 
    }
 
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
                     FilterChain arg2) throws IOException, ServletException {
        arg0.setCharacterEncoding(encoding);
        HttpServletRequest req = (HttpServletRequest) arg0;
        String type = req.getHeader("Content-Type");
        if (type == null || !type.startsWith("multipart/form-data")) {
            arg2.doFilter(arg0, arg1);
        } else {
            HttpServletRequestWrapper multi = new HttpServletRequestWrapper(req);
            req.setCharacterEncoding(encoding);
            arg2.doFilter(multi, arg1);
        }
}
    public void init(FilterConfig filterConfig) throws ServletException {
        encoding = filterConfig.getInitParameter("encoding");
    }
}

代码是从网上看到的,希望对于同学有帮助。 另外要在web.xml加上

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
     <filter>
        <filter-name>FilterChain</filter-name>
        <filter-class>wechat.FilterMain</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>FilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

客户端

在客户端获取服务器信息的时候可以将获取的信息用utf-8显示,缓冲流的方式如下主要代码

1
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inStream,"utf-8"));

还有对于StringBuffer的如下,也是使用utf-8的方式

1
String result = new String(tStringBuffer.toString().getBytes(),"utf-8");

总的来说错误很简单,但是不注意到确实挺难解决,希望对于同样无法解决的有一定的帮助吧。