作为一个java web的开发者,都不可避免会碰到乱码问题;通常情况下,我的解决方式是这样的:出现乱码,马上百度,不断的尝试,然后乱码消失了,就自以为是的认为解决了。
乱码问题,出现的频率很大,所以我要总结总结。
1.前台传递到后台,后台接到数据的时候是乱码
所有的案例我都是在spring mvc下完成的,模拟访问使用URLConnection,和HttpURLConnection这两个类来测试
我们前台传参数,无非有三种:
1.直接使用url拼接
2.模拟表单传参
3.流的方式传参
先说说第一种拼接URL传参的时候,通常情况下会出现前台传来的中文,在服务器接到的时候中文变成乱码情况。对于这种情况:解决的方式是
直接修改tomcat配置文件server.xml
在监听端口处添加:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" /> //红色那句,表面服务器以UTF-8编码,若不设置,则不是以UTF-8编码,这是直接的解决方式,但是却不是最好的方案,因为tomcat是容器,我们的项目要让所有的容器都可使用,显然这不是最好的方案。
所以第二种方案:其实一般情况下,我们会有个编码的拦截器,使前台传递到后台的都不会出现乱码。
只能在服务器端处做些处理:new String(request.getParameter("TOKEN").toString().getBytes("iso8859_1"),"utf-8"); 永远是这一句
第二种:程序往数据库写的时候,乱码了。但是数据库读数据的时候不是乱码。
这种解决方式:要么是连接数据库的时候异常了,要么是数据库配置文件的编码集问题。
以mysql为例:
第一种:1.程序连接数据库的时候:jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8
第二种:数据库配置文件my.ini中:设置字符编码加上(没有的才加上,不要重复)
default-character-set=utf8
character-set-server=utf8
这两种方法绝对可以解决。因为,是我亲身经历的坑。
模拟表单传参:
在模拟的表单传参的时候:
使用post传参:
@Test
public void testPut() throws IOException {
URL url = new URL(
"http://localhost:8080/androidserver/xinxi/ccc.do");
URLConnection rulConnection = url.openConnection();
HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setDoInput(true);
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestProperty("Accept-Charset","UTF-8");
httpUrlConnection.setRequestMethod("POST");
httpUrlConnection.connect();
DataOutputStream outS = new DataOutputStream( httpUrlConnection.getOutputStream());
String content = "INFOR=小强";
<span > </span>content +="&TOKEN=xiaobai";
<span > </span>outS.write(content.getBytes());
<span > </span>outS.flush();
<span > </span>outS.close();
InputStream in = httpUrlConnection.getInputStream();
StringBuffer out = new StringBuffer();
byte[] b = new byte[1024];
int n = -1;
while ((n = in.read(b)) != -1) {
out.append(new String(b, 0, n));
}
System.out.println(out.toString());
httpUrlConnection.disconnect();
使用HttpURLConnection这里要注意的是凡是使用了httpUrlConnection.getOutputStream() 那么将以POST提交,即便使用
httpUrlConnection.setRequestMethod("GET");,那么也将以POST的方式提交;
另外: httpUrlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //表示以表单提交
httpUrlConnection.setRequestProperty("Content-Type","text/json;charset=UTF-8"); //表示以json
httpUrlConnection.setRequestProperty("Content-type","application/x-java-serialized-object"); //表示以序列化对象提交
如果不设置,将以表单形式提交。
第三:流的方式传参:英文没什么太大问题,问题是中文出现乱码:
设置httpUrlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");
然后写出流,服务器端接收流:
InputStream in=request.getInputStream();
InputStreamReader read=new InputStreamReader(in);
BufferedReader br=new BufferedReader(read);
System.out.print(br.readLine());
测试了很多方法,任然无法得到中文,所以希望知道的告知一声。
本文暂时终结。