servlet URL重写传值乱码最终解决

servlet URL重写传值乱码终极解决

http://localhost:8080/ServletTest/url2?name=张三&age=27

String name=request.getParameter("name");

我用了很多方法,如:

加上<meta http-equiv=Content-Type content=\"text/html;charset=gb2312\">    NO!

加上request.setCharacterEncoding("gb2312")    NO!

加上response.setContentType("text/html;charset=gb2312")    NO!

 下面的方法解决了问题:

先来看一个String类的方法:
byte[]
 getBytes(Charset charset) 
使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。

再来看一个String类的构造方法:

String(byte[], Charset) - 类 java.lang.String 的构造方法

    通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String

public String(byte[] bytes,Charset charset)
通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。新 String 的长度是字符集的函数,因此可能不等于 byte 数组的长度。

此方法总是使用此字符集的默认替代字符串替代错误输入和不可映射字符序列。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。

参数:
bytes - 要解码为字符的 byte
charset - 要用来解码 bytes 的 charset

这样通过下面的语句就能正确地输出汉字了:

out.println("name="+new String(name.getBytes("ISO-8859-1"),"gb2312"));

注:ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF;

把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。
正是这个原因,要将iso-8859-1作用中间转码。