首先说一下乱码问题的产生最根本的原因就是使用错误的字符集解码字节流或者将给定的字符串用错误的字符集编码成错误字节流造成的,例如”中文”两个汉字,如果用ISO8859-1字符集将其编码为字节流,因为这个字符集不支持中文,所以就会出错,输出结果为3f3f,其意义就是??。再例如”中文”二字的GBK的字节流为d6 d0 ce c4,可是我们要是用不兼容的字符集去解码,例如用ISO8859-1或者UTF-8,这随后产生的字符串就是乱码,或者是其他的某个字符。
编写java 或者javaWEB的程序,不可避免都要处理编码问题,最常见的问题就是中文乱码
大概的思路就是对字符采用重新编码,分两种情况
GET和POST,取决于你的页面编码,如果你的页面编码为iso8859_1
使用:String str= new String(req.getParameter("str").toString().getBytes("iso8859_1"), "GBK");
或者 String str= new String(req.getParameter("str").toString().getBytes("iso8859_1"), "UTF-8");
但是,这里要注意,必须保证你的页面编码也是iso8859_1的,因为,上面的代码的意思是先将你的字符串变为iso8859_1字节流,
然后再转化为GBK编码,如果你页面传过来的编码是utf-8,那么按照上面的方法就会出现:???乱码
你页面是utf-8的,就要使用如下编码:
String str= new String(req.getParameter("str").toString().getBytes("utf-8"), "GBK");
或者 String str= new String(req.getParameter("str").toString().getBytes("utf-8"), "GB2312");
Tomcat对于GET请求并不会考虑使用request.setCharacterEncoding方法设置的编码,而会永远使用iso-8859-1编码,而这位朋友使用的正好是GET请求,因此,tomcat将会使用iso-8859-1将提交的字节转换成字符串。
所以,对于使用get方式传值的时候,统一使用
String str= new String(req.getParameter("str").toString().getBytes("iso8859_1"), "GBK");当然,前提是你服务器是tomcat
第二:Ajax传值
这个比较麻烦,据测试,不同的浏览器有不同的对中文编码,怎么办呢?
我们可以采用js的encodeURI()进行统一的编码,然后在后台进行统一的解码
对应的java解码代码:str= java.net.URLDecoder.decode(str, "UTF-8");
java 编程中一个万能的解决乱码的方式就是
java.net.URLDecoder.encode(str, "UTF-8");) 先用一种编码方式对字符进行编码
java.net.URLDecoder.decode(str, "UTF-8");) 再使用相同的编码方式对字符进行编码
原文:http://my.oschina.net/lichao100/blog/390935