首页 > 代码库 > JAVA 常见乱码问题及MYSQL character_set_server 设置

JAVA 常见乱码问题及MYSQL character_set_server 设置

最近接手一个手机端服务端的程序(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图文安装教程16



这里设置错了你mysql工具里面是查看数据库编码是看不到的,只能通过 show variables like "%char%"; 命令查看设置

wKioL1RH4LLT97zPAAHjnyg8d5k447.jpg

红框框就是向导设置的编码,没有设置之前latin1,如果要修改这个值的话只能是运行mysql/bin/MySQLInstanceConfig.exe,重新设置

不要用命令( set @@character_set_server=‘utf8‘;)服务重启之后就无效了!这个地方设计的不太明白,改变这个值以后要重启,重启之后这个设置又会无效!


本文出自 “岁月无声” 博客,请务必保留此出处http://6229839.blog.51cto.com/6219839/1566969

JAVA 常见乱码问题及MYSQL character_set_server 设置