您的位置:首页 > Web前端 > JavaScript

jsp 编码问题

2012-03-03 18:54 141 查看
jsp编写网站时,经常会出现如下图所示的乱码情况:



原因是:
request.setCharacterEncoding("GBK");
String title=request.getParameter("title");
// new String(new String(title.getBytes("GBK"),"ISO-8859-1").getBytes("ISO-8859-1"),"utf-8" );
而本来应该是
request.setCharacterEncoding("UTF-8[/b]"); 的。

一个中文字符,GBK占两个字节;UTF-8占三个字节。
以上例来说,本来应该显示“反扫荡”,UTF-8编码的,9个字符。实际上http协议传过来的就是9个字节。注意:网络传输都是UTF-8编码的。
如果对9个字节按照GBK编码码的话,就是4个中文字符加一个字节,所以就出现了如上图所示的乱码情况。
执行 new String(title.getBytes("GBK") 时,应该返回的是10个字节,然后这10个字节又按照UTF-8编码,就是三个中文字符加一个字节,所以就出现了如上图所示的乱码现象。

然后我用java程序验证了上面的原理:

@Test
public void Test0108_22(){
String input="反扫我";
try
{
System.out.println(input.getBytes("GBK").length);
System.out.println(input.getBytes("UTF-8").length);
System.out.println(bytes2HexString(input.getBytes("UTF-8")));
String title= new String(input.getBytes("UTF-8"),"GBK");
System.out.println(title);
String new_title=new String(new String(title.getBytes("GBK"),"ISO-8859-1").getBytes("ISO-8859-1"),"utf-8" );
System.out.println(new_title);
System.out.println(bytes2HexString(new_title.getBytes("UTF-8")));
System.out.println(new_title.getBytes("UTF-8").length);
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}

运行结果:



z总结:"反扫我"这三个中文字符,如果按照GBK 编码,就是6个字节;如果按照UTF-8编码,就是9个字节;
实际上, request.setCharacterEncoding("UTF-8[/b]"); 就是解码[/b]的过程,即告诉程序把9个字节按照"UTF-8[/b]"解码,这样就ok了。
网站中中文的编码一般有如下三种情况
(1)UTF-8
(2)GBK
(3)GB2312
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsp web gbk 乱码 中文