java ee乱码的问题的解决方案

作为一个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&amp;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 style="white-space:pre">		</span>content +="&TOKEN=xiaobai"; 
<span style="white-space:pre">		</span>outS.write(content.getBytes());
  <span style="white-space:pre">		</span>outS.flush();  
          <span style="white-space:pre">	</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()); 
测试了很多方法,任然无法得到中文,所以希望知道的告知一声。
本文暂时终结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值