servlet——编码处理

字符编码基本概念:

JAVA中通常有char、byte、String这几个概念。char指的是一个UNICODE字符,为16位的整数。byte是字节,字符串在网络传输或存储前需要转换为byte数组。在从网络接收或从存储设备读取后需要将byte数组转换成String。String是字符串,可以看成是由char组成的数组。String和char为内存形式,byte是网络传输或存储的序列化形式

编码方式的简介

String序列化成byte数组或反序列化时需要选择正确的编码方式。如果编码方式不正确,就会得到一些0x3F的值。常用的字符编码方式有ISO8859_1、GB2312、GBK、UTF-8/UTF-16/UTF-32。ISO8859_1用来编码拉丁文,它由单字节(0-255)组成。GB2312、GBK用来编码简体中文,它有单字节和双字节混合组成。最高位为1的字节和下一个字节构成一个汉字,最高位为0的字节是ASCII码。UTF-8/UTF-16/UTF-32是国际标准UNICODE的编码方式。   用得最多的是UTF-8,主要是因为它在对拉丁文编码时节约空间。

Java SE API中关于编码操作的常用方法

String str = "中国";
// 取得GB2312编码的字节
byte[] bytesGB2312 = str.getBytes("GB2312");
// 取得平台缺省编码的字节(windows为GB2312)
byte[] bytesDefault = str.getBytes();
// 用指定的编码将字节转换成字符串
String newStr = new String(bytesGB2312, "GB2312");
// 用平台缺省的编码将字节转换成字符串(solaris为ISO8859_1,windows为GB2312)
String newDefaultStr = new String(bytesDefault);
// 用指定的编码从字节流里面读取字符
InputStream in = new FileInputStream(new File("1.txt"));
InputStreamReader reader = new InputStreamReader(in, "GB2312");
char aChar = (char) reader.read();
当通过浏览器向tomcat发出请求访问servlet时,服务器将请求信息和响应信息封装在request和response对象交给响应的servlet处理,程序中的字符串默认按ISO-8859的查找和输出
案例1.
提交页面编码为:GBKimage
servlet编码为系统默认
String username = request.getParameter("username");
imageSystem.out.println(username); 
结果如图
分析如下,当request.getParameter("username");获得客户端表image单信息时,默认安装ISO-8859的编码解码,然后输出到控制台,出现字符编码不一致产生乱码
解决办法 是在servlet方法头部添加
request.setCharacterEncoding("GBK");
如图

案例2.image

例如:对于输出:response.getwrite().write("中国"),在浏览器中显示乱码:  
应为response.getwrite().write("中国"),默认按照ISO-8859编码响应服务器发送“中国”,而我们用的浏览器默认为GBK或GB2312编码,从而导致编码不同产生乱码

解决办法:

//设置resposne的码表image
response.setCharacterEncoding("UTF-8");

//并且要通知浏览器以相应格式打开:
response.setContentType("text/html;charset=UTF-8");

 

posted on 2010-04-23 23:28 braden 阅读(2595) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜