最近接手一个手机端服务端的程序(JAVA实现),我这边测试的话前台直接用的get方式传数据,
get请求编码方式和post请求提交编码方式不同,get是把数据直接放到url中,例如以上的uname,IE浏览器先对中文进行utf-8编码(一个中文3个字符表示 太长),继而为了缩短字符又用ISO8859-1编码后传递给服务器。服务器的doGet方法中要先进行ISO8859-1解码再utf-8解码才能看到中文。
post请求则在浏览器端把数据以utf-8的形式存储到http的请求体中,不用通过url传输,继而只要 request.setCharacterEncoding("utf-8");通知request以utf-8形式解码就行,因为request默认以ISO8859-1进行解码的。
第一种我们可以针对方法设置编码格式(这个设置必须在Writer之前,否则无效)
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
或者
content=new String(content.getBytes("iso-8859-1"), "UTF-8" );
第二种我们可以自己写过滤器(推荐方案)
private String charset; public void init(FilterConfig config) throws ServletException { System.out.println("init"); // 获取web.xml文件里面的<init-param> // <param-name>encode</param-name> // <param-value>gbk</param-value> // </init-param> name为encode的值 为gbk charset = config.getInitParameter("encode"); } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(charset); response.setCharacterEncoding(charset); System.out.println(charset); chain.doFilter(request, response); } public void destroy() { System.out.println("destroy"); }
web.xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>com.sjs.filter.EncodingFilter</filter-class> <init-param> <param-name>encode</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> /filter-mapping>
第三种我们直接修改tomcat的 server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
以上三种基本上就可以解决问题了,
但是我们还有一个问题,就是数据库(MYSQL)设置,一定要记得安装向导的时候一定你 Character Set设置成utf8的时候一定要选中(今天我碰到的问题就是这),
这里设置错了你mysql工具里面是查看数据库编码是看不到的,只能通过 show variables like "%char%"; 命令查看设置
红框框就是向导设置的编码,没有设置之前latin1,如果要修改这个值的话只能是运行mysql/bin/MySQLInstanceConfig.exe,重新设置
不要用命令( set @@character_set_server=‘utf8‘;)服务重启之后就无效了!这个地方设计的不太明白,改变这个值以后要重启,重启之后这个设置又会无效!