由于计算机中的数据都是以二进制形式存储的,因此,当传输文本时,就会发生字符与字节之间的转换。字符与字节之间的转换是通过查码表完成的,将字符转换成字节的过程称为编码,将字节转换成字符的过程称为解码,如果编码和解码使用的码表不一致,就会导致乱码问题。
创建servlet 在test项目的cn.itcast.response包中编写一个名为ChineseServlet的类,在该类中定义一个中文字符串,然后使用字符输出流输出。
配置映射信息,查看运行结果
在web.xml中配置完成ChineseServlet的映射后,启动Tomcat服务器,在浏览器的地址栏输入地址:“http://localhost:8080/chapter/ChineseServlet”访问ChineseServlet,浏览器的显示结果为“??”,说明发生了乱码问题。实际上此处产生乱码的原因是response对象的字符输出流在编码时,采用的时ISO8859-1的字符码表,该码表并不兼容中文,会将“中国”编码为“63 63”(在ISO8859-1的码表中查不到的字符就会显示63)。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63”解码为“?”,因此,浏览器将“中国”二字显示成了“??”。
为了解决上述编码错误,在HttpServletResponse接口中,提供了一个setCharacterEncoding()方法,该方法用于设置字符的编码方式,在设置内容前加一行代码,设置字符编码使用的码表为UTF-8。
在浏览器的地址栏输入地址:“http://localhost:8080/chapter/ChineseServlet”再次访问ChineseServlet,浏览器显示结果不再为?,但是依然乱码。通过分析发现,这是由于浏览器解码错误导致的,因为response对象的字符输出流设置的编码方式为UTF-8,而浏览器使用的解码方式为GB2312。对于此类错误,可以通过修改浏览器的解码方式解决。对于IE浏览器,点击菜单栏中的查看--》编码--》Unicode(UTF-8)选项,将浏览器的编码方式设置为UTF-8之后浏览器显示结果为“中国”,没有出现乱码。由此说明,通过修改浏览器的编码方式可以解决乱码,但是,这样的做法仍然是不可取的,因为用户每次去修改浏览器编码太麻烦,为此,在HttpServletResponse对象中,提供了两种解决乱码的方式:
方式一:
方式二:
通常情况下,为了使代码更加简洁,会采用第二种方式。接下来对ChineseServlet进行修改,使用第二种方式解决乱码问题。启动Tomcat服务器,在浏览器 在浏览器的地址栏输入地址:“http://localhost:9999/chapter/ChineseServlet”重新访问ChineseServlet,浏览器显示出了正确的中文字符。