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

new String(str.getBytes("ISO-8859-1"),"GBK")是怎么样一种机制
new String(str.getBytes("ISO-8859-1"),"GBK")
如题,假设str=request.getParameter("name"); name传到servlet一个中文名字

我看到很多人在碰到乱码问题时,都提示要使用new String(str.getBytes("ISO-8859-1"),"GBK");
原因是jsp页面编码设为GBK了
但我觉得就不对了:
首先,假设在jsp页面输入了一个name 小二,小二的gbk编码假设为oxaabb;现在name传到servlet,
在穿的过程中,如果用iso-8859-1传,那么该编码本身就不支持中文,将直接用两个?代替,
那么我再用new String(str.getBytes("ISO-8859-1"),"GBK")转又有什么用,还是两个?啊

请高手解析一把

------解决方案--------------------
oxaabb转化成iso-8859-1编码方式是:0x0a0a0b0b,iso8859-1不能表示中文,但是oxaabb它本来就不是中文啊!
new String(str.getBytes("ISO-8859-1"),"GBK")
就是把0x0a0a0b0b按照ISO-8859-1方式还原出原来的自己数组,也就是oxaabb,然后按照GBK生成新的字符串,也就是小二
------解决方案--------------------
tomcat默认全部都是用ISO-8859-1编码,不管你页面用什么显示,Tomcat最终还是会替你将所有字符转做ISO-8859-1.那么,当在另目标页面再用GBK翻译时就会将本来错的编码翻译成GBK的编码,这时的文字会乱码.

所以需要先将得到"字符"(不管是什么)都先用字节数组表示,且使用ISO-8859-1进行翻译,得到一个在ISO-8859-1编码环境下的字节数组.例如:AB表示成[64,65].然后再用GBK编码这个数组,并翻译成一个字符串.

那么我们可以得到一个编码转换的过程
假设:GBK码("你")->URLencode后变成->(%3F%2F)->Tomcat自动替你转一次ISO-8859-1->得到( 23 43 68 23 42 68 每一个符号表示为ISO-8859-1中的一个编码)->接收页面--->再转一次为ISO-8859-1的Byte数组[23,43,68,23,42,68]--->用GBK再转为可读的文字--->(%3F%2F"---->转为("你")