【第22期】观点:IT 行业加班,到底有没有价值?

关于JAVA中文乱码(1)

原创 2016年06月01日 15:39:02
关于JAVA中文乱码的一些看法
编程,让人无语的就是,业务逻辑都写好了,什么都弄好了,但是乱码出现了。研究乱码的这一段时间,让我也有了一点点对处理乱码的心得。现在,我来说说我对乱码的看法。
   

例子:

前台--jsp(utf-8):

<form action="相应的action" method="@"><input name="test" value="测试" type="submit"/>

后台-servlet :

如果@=post:

doPost(...){System.out.println(request.getparameter("test"));//显示的是???è??,乱码出现。
System.out.println(request.getQueryString());//显示null,无值。} 
如果@=get: 
doGet(...){System.out.println(request.getparameter("test"));//显示的是???è??,乱码出现。
System.out.println(request.getQueryString());//显示test=%E6%B5%8B%E8%AF%95,获取到编码后的test。}

由上可以看出几点:
1、post提交,request.getQueryString()方法获取不到值,只有get提交才行。
2、jsp向后台提交数据,自动进行你所设置的编码格式进行编码。因此后台获取的都是编码好的数据,如get提交时,地址栏的显示即可印证:http://10.110.10.11:8080/test1/test?test=%E6%B5%8B%E8%AF%95。那我就要说道说道了,test传到后台是%E6%B5%8B%E8%AF%95,为什么request.getparameter("test")获取到的却是???è??呢,那是因为request方法获取值时,会自动进行一次解码工作,而且是默认的ISO-8859-1(可以通过设置request.setCharacterEncoding("utf-8")改变默认的ISO-8859-1)。
 
那么,如何获取正确格式的数据呢?

同样分两种:

如果@=post:

request.setCharacterEncoding("utf-8"); //输出时显示的是 测试。
如果@=get:
request.setCharacterEncoding("utf-8"); //输出时显示的仍是???è??。


由上可以看出:
  1.post提交,只需调用getparameter之前设置request.setCharacterEncoding("utf-8"); 即可避免乱码。(post提交因此十分方便,不容易出现乱码,所以我们重点是说说get提交)
  2.get提交,以上方法然并卵。那么,如果我们用java.net.URLDecoder.decode(String,"utf-8");进行utf-8解码呢?
System.out.println(java.net.URLDecoder.decode(request.getparameter("test"), "utf-8"));直接输出结果怎样,结果任然是???è??。为什么呢?因为我前面已经说了jsp向后台提交数据自动进行一次编码,而request.getparameter("test")的方法,会自动做一次解码的工作,因此以上方法进行解码是解码了两次,发现没有?request解码一次,URLDecoder解码一次,印证该观点很简单:
System.out.println(request.getparameter("test"));//输出???è??,进行了一次解码System.out.println(java.net.URLDecoder.decode("??è??", "utf-8"));//输出??è??,也看出了当对一个已编码的数据重复解码时,仍然解出的是一样的。
既然都知道了原因,那就知道解决办法了,既然前台编码一次,后台用request.getparameter("test"),并设置request解码方式为utf-8在get提交里面行不通,那我们就在前台编码两次呗,而以上URLDecoder解码反正不就是解码了两次么。前台进行第二次编码: jsp:
<a href="test2.jsp?url=<%=java.net.URLEncoder.encode(String,"utf-8")%>">进行编码</a>   //超链接 href也可以写一个Action,后台web.xml或者Struts.xml能拦截到就行。 对表单的编码,等以后找到方法了再加进来。
js:
window.open(url+"?name="+encodeURI(encodeURI(document.getElementByName("name").value)));记住:要想用JS实现jsp的java.net.URLEncoder.encode必须用两次编码:encodeURI(encodeURI(str));,因为js不会像jsp一样自动进行一次编码。
  这样,后台使用System.out.println(java.net.URLDecoder.decode(request.getparameter("test"), "utf-8"));可以输出"测试"。


其实,像这样前面两次,后面两次的,真的很麻烦。有人问了,还有没有什么简单一点的办法啊?---办法嘛,还是有的,那就是在前台不做任何处理的情况下,后台只需用以下代码即可实现get提交乱码问题(post提交,同样有效--万能办法):
String name =new String(request.getParameter("test").getBytes("iso8859-1"),"utf-8");//意思就是new一个String,把request解码后的String转换成utf-8。嗯,这个是转换,不是第二次解码了。
 System.out.println(name);//输出"测试" 一个完美解决乱码的办法。 
又有人说了,那你直接拿出最后一个办法就行了嘛,前面说一大堆干嘛,我只想说五个字:让我装个逼! 哈哈,开个玩笑,其实不然,有时我写代码时,发现这个万能办法有时也不管用,后台仍然是乱码,具体是为什么,我也不知道,问题涉及得太高深,我还不懂,只能继续学习强化自己了。还有就是,比如,你用ajax实现异步刷新页面,提交的时候那一定是js提交吧,对于json的编码,你还不是要用到先前的办法。
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

Java读取文本文件中文乱码问题

最近遇到一个问题,Java读取文本文件(例如csv文件、txt文件等),遇到中文就变成乱码。读取代码如下: List lines=new ArrayList(); BufferedReade...

JavaWeb的各种中文乱码终极解决方法

一、Servlet输出乱码 1. 用servlet.getOutStream字节流输出中文,假设要输出的是String str ="钓鱼岛是中国的,无耻才是日本的"。 1.1 若是本地服务器与本地...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Java Web项目中解决中文乱码方法总结

java web中几中乱发分析+解决方案

java中文乱码解决之道(一)-----认识字符集

沉寂了许久(大概有三个多月了吧),LZ“按捺不住”开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题。阅读...

java中文乱码解决之道(八)-----解决URL中文乱码问题

我们主要通过两种形式提交向服务器发送请求:URL、表单。而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面。通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不...

Java Web项目中解决中文乱码方法总结

第一种情况:调用jsp页面中文显示乱码 问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码。 解决方法:首先确认本jsp在编辑器中保存文件内容时,使用的是utf-8的编码格式,然...

Java读写txt文件中文乱码问题

问题:在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码。原因其实很简单,就是系统的编码和程序的编码采用了不同的编码格式。通常,假如自己不修改的话,windows自身采...
  • WOOSHN
  • WOOSHN
  • 2012-10-04 17:47
  • 54722

java 中文乱码 问号

在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编...

中文乱码在java中URLEncoder.encode方法要调用两次解决

一、场景: 1、我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码,服务器端才能用decode方法一次获取。 例如:var xing=e...
  • kongqz
  • kongqz
  • 2013-06-05 10:33
  • 34197

Java各种中文乱码问题及解决方案

问题的根源 Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题...
  • e_yohn
  • e_yohn
  • 2011-08-19 22:42
  • 2895
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)