中文编码:
JS:encodeURI("这里放url")将url编码,用的时候再用decodeURI("接收到的值")解码。String ss=encodeURI(encodeURI("接收到的值"));
JAVA:String ss=URLDecoder.decode("接收到的中文值","UTF-8");
对于页面端发送到服务器中文导致的乱码问题
当页面段和服务器端使用的编码方式都是GB2312的时候
解决办法是在页面端获取需要发送的字符串,进行两次编码再传送到服务器,代码如下
varuserName = document.getElementByIdx("UserName").value;
//但页面请求参数出现中文,在页面端取得参数后进行两次编码。
//然后在服务器端对编码后的内容进行一次解码,就可以解决这个问题。
userName= encodeURI(encodeURI(userName));
//在服务器端,对接收到的数据进行一次解码操作就可以解决问题具体操作如下
Stringold = request.getParameter("name");
//对经过页面端两次编码的参数进行一次解码。避免了中文乱码问题.
Stringname = URLDecoder.decode(old,"utf-8");
这样问题就得以解决
其中具体的原理分析如下,假设页面端输入的中文是一个“中”,按照下面步骤进行解码
1.第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]
2.第二次encodeURI,把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,URldecode操作和encodeURL操作是相反的操作,处理结果就是[%E4,%B8,%AD],并把这个值返回给getParameter方法
然后再在servlet中调用URLDecoder.decode(old,"utf-8")就可以把数据还原成最初页面发送过来的中文“中”了。
这么在页面两次编码encodeURI(encodeURI(userName));再到服务器用utf8方式解码一次URLDecoder.decode(old,"utf-8");这么麻烦的原因是:应用服务器自身总会进行一次URLdecode操作,而不同版本的应用服务器解码所用的编码版本又都不一样,如果把数据直接发送到应用服务器,结果不同版本的应用服务器解码得到的结果是不可预料的,必然得到的是乱码。而这样在页面段两次编码后产生的[%25E4,%25B8,%25AD]无论结果什么版本的应用服务器解码,产生的结果都是[%E4,%B8,%AD]。这样在servlet那里进行一次URLDecoder.decode(old,"utf-8");就可以得到正确的结果。(再具体的东西目前还没有查到详细资料,等搞清楚再解释)
中文编码:
JS:encodeURI("这里放url")将url编码,用的时候再用decodeURI("接收到的值")解码。String ss=encodeURI(encodeURI("接收到的值"));
JAVA:String ss=URLDecoder.decode("接收到的中文值","UTF-8");
转载于:https://www.cnblogs.com/jessie-fu/p/3582899.html
中文乱码是忧虑我们每一个java前后端菜鸟开发的很烦的一个问题,这不今天刚好看到一篇很好的文章,所以就搬运过来了。灰常感谢这位博主,分享的精神。
浏览器页面展示中文时出现乱码错误解决方案:
1.设置page指令的编码为UTF-8
2假如请求页面,从某页面传输中文到另外的页面时中文乱码:
通过request.setCharacterEncoding(“UTF-8”);3.Get请求的时候,tomcat有问题,默认传输编码用的是ISO-8859-1,中文
有问题,解决办法:tomcat-conf-server.xml
在 8443 后面加上useBodyEncodingForURI=”true“/>
改了后,还得在eclipse中重新映射一遍
String user = request.getParameter(“user”);
user = new String(user.getBytes(UTF-8),“UTF-8”);
reponse.getWriter().write(user);