日期:2014-05-18  浏览次数:20827 次

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,这个肯定会错。英文可能不会错,但是中文他们的编码方式不同不能这样转换
------解决方案--------------------
确实是不可逆的,因为有的转换有可能丢失信息
------解决方案--------------------
只要双方编码都包含的字符,是可逆的。
------解决方案--------------------
同意楼上。
楼主的问题跟编码方式有关,只要两种编码方式对某一字符存在一个唯一映射,就是可逆的。