java中字符串编码的转换以及乱码后的处理总结

java中编码的转换。

常见的编码也就ISO8859-1,GBK,GB2312,UTF-8

java里有String这个类存储并处理字符串,同样String里有个方法叫getBytes(),这个方法起着编码转换的作用。


API里这样解释这个方法:

Encodes this String into a sequence of bytes using the named charset, storing the

result into a new byte array. (用某种编码加密这个字符串,保存到byte数组中)

举个例子吧:
utf-8的String对象转gb2312的String对象

有个以utf-8保存的字符串对象"你好",对象名是str
其UTF-8的二进制代码是-28-67-96-27-91-67
你若用UTF-8的规则去读这个二进制编码,对外表现就是“你好”这两个大字。
若用其他编码规则去读,那就是所谓的乱码。(String对象里已处理,所以输出永远是正确的‘你好’)


你若用str.getBytes("utf-8") 得到的就是-28-67-96-27-91-67这个数组
若new String(-28-67-96-27-91-67, "utf-8")就会再次得到utf-8的“你好”字符串

但是你若想把str:"你好"这个以utf-8形式保存的字符串对象转换为gb2312保存的String对象时该怎么办呢。

很简单,用getBytes()这个方法

"你好".getBytes("gb2312")就可以得到这个字符串对应的gb2312编码规则的byte数组
即-60-29-70-61
然后在new String (-60-29-70-61, "gb2312")就可以得到gb2312的"你好"的String对象了。

总结,字符串编码转换,只要被转换的字符串的编码是正确的,没有乱码的情况,只要

String 转换后的字符串 = new String("源字符串".getBytes("目标编码"),"目标编码");


————————————————————————————————


当然有时候我们也会处理得到的是乱码字符串,想把他矫正的情况。上面的方法就不适用了,
但是原理一样,
比方说jsp以get方式url传递数据的时候,因为Tomcat默认是以ISO8859-1形式传递的,
若中文传递到servlet,我们直接request.getParameter()得到的字符串会乱码。
因为中间Tomcat会把我们的url以ISO8859-1编码进行urlEncode,我们后台得到数据后再以ISO8859-1
解码,我们request.getParameter()得到的字符串对象就不我们想要的东西,

这个时候只要逆着来一遍得到以原先编码的二进制,然后再new String即可
new String(str.getBytes("ISO8859-1"),"原来的编码");
即可得到正确的。

上述过程其实是这样的

1、我们发送的数据,str是utf-8字符串,二进制是:-28-67-96-27-91-67('你好')
2、tomcat把它的二进制编码用ISO8859-1进行读后new了个String str2 =(str.getBytes("utf-8"),"ISO8859-1")
虽然这个字符串二进制还是-28-67-96-27-91-67,但str2里储存的读取方式是ISO8859-1肯定乱码。
3、我们得到这个乱码字符串str2后,首先,str.getBytes("ISO8859-1"),因为str2对象里储存的编码方式就是ISO8859-1,所

以不会改变二进制,也就是说得到是还是-28-67-96-27-91-67,这个是原来utf-8下的“你好”,
现在只要再new String(那个byte数组,“utf-8”);即可还原

你可能感兴趣的:(java,编码)