String.getBytes()方法是否可逆?
我在Tomcat下有2个用来测试编码的jsp:encode1.jsp,encode2.jsp
encode1:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN ">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME= "Generator " CONTENT= "EditPlus ">
<META NAME= "Author " CONTENT= " ">
<META NAME= "Keywords " CONTENT= " ">
<META NAME= "Description " CONTENT= " ">
<Script>
function sendGB2312(){
var oReq = new ActiveXObject( "Microsoft.XMLHTTP ");
var proxyURL = "encode2.jsp?name=测试 ";
oReq.open( "POST ", proxyURL, false);
oReq.send(null);
}
</Script>
</HEAD>
<BODY onload= "sendGB2312() ">
</BODY>
</HTML>
encode2.jsp:
<%
String name = (String)request.getParameter( "name ");
System.out.println(name+ ":1 ");
name = new String(name.getBytes( "ISO-8859-1 "), "GB2312 ");
System.out.println(name+ ":2 ");
name = new String(name.getBytes( "GB2312 "), "UTF-8 ");
System.out.println(name+ ":3 ");
name = new String(name.getBytes( "UTF-8 "), "GB2312 ");
System.out.println(name+ ":4 ");
%>
访问encode1.jsp的时候,后台打印出的结果如下:
????:1
测试:2
????:3
锟斤拷锟斤拷:4
想问一下,第3,4步是不是不可逆的?谢谢!
------解决方案--------------------从你的测试结果来看 他们是不可逆的 呵呵~
------解决方案--------------------这个属于编码方式的问题了,gb2312是两个字节的,utf-8好像是2-3个字节的把,不固定
这样转容易丢失信息
------解决方案--------------------String test= "速度 ";
String s= new String(test.getBytes( "utf-8 "), "gbk ");
String s1= new String(s.getBytes( "gbk "), "utf-8 ");
System.out.println(s1);
这样转就不会乱码,但被转的字数必须是偶数个否则最后个乱码
------解决方案--------------------name原来是ISO-8859-1编码的,你3、4你getBytes的编码方式错了,转换肯定出错。
1错是你没有设置页面的编码格式默认是GB2312,显示处理是乱码。
可不可逆是两种编码之间的转换,而不是一种ISO-8859-1的你按utf-8变成字节数组,然后转换成gbk,这个肯定会错。英文可能不会错,但是中文他们的编码方式不同不能这样转换
------解决方案--------------------确实是不可逆的,因为有的转换有可能丢失信息
------解决方案--------------------只要双方编码都包含的字符,是可逆的。
------解决方案--------------------同意楼上。
楼主的问题跟编码方式有关,只要两种编码方式对某一字符存在一个唯一映射,就是可逆的。