java中字符串编码的转换以及乱码后的处理总结
2014-12-12 10:30
253 查看
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”);即可还原
常见的编码也就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中字符串编码的转换以及乱码后的处理总结
- 如何用java实现不同编码方式字符串的转换(包含异常处理、重复不终止输入、缓冲区bufferedreader的使用)
- 字符集编码以及java乱码问题学习总结
- 关于java和php以及html的所有文件编码和乱码的处理汇总
- 解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
- java中字符串处理、串联和转换的几个常用方法,以及如果需要自己编程实现的具体实施步骤。
- 解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
- 【转】Java编码与乱码---GBK与UTF-8之间的转换
- java中字符串转换成时间格式总结
- JAVA字符串转时间及编码格式转换等
- java怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
- java中字符串转换成时间格式总结
- JNI 中文字符串转换乱码的处理(zz)
- JSP编码以及乱码解决总结
- JSP编码以及乱码解决总结
- java与C#字符串转换成日期处理比较
- Java 关于中文乱码处理的经验总结
- JSP编码以及乱码解决总结
- 最基本的一个转换密码字符串为乱码以及解码的程序
- Java基础小知识——基本数据类型和字符串以及字节数组的转换