response.getOutputStream().write("你好呀我是中国".getBytes());//显示正常
“你好呀我是中国”.getBytes()这句代码在转成byte[]数组的时候默认查的是gb2312编码,而"你好呀我是中国"支持gb2312编码,所以可以正常显示出来。
如果charset=gb2312 ,即告诉浏览器网页的编码格式为gb2312
但是,程序要实现通用性,应该使用的是UTF-8编码,我们在字符串转换成字节数组时指定UTF-8编码
response.getOutputStream().write("你好呀我是中国".getBytes("UTF-8"));//显示乱码
为什么它变成了乱码呢?原因是这样的:我在向服务器输出的中文是UTF-8编码的,而浏览器采用的是GBK,GBK想显示UTF-8的中文数据,不乱码才怪呢!
那么就要去给浏览器右键选择编码为UTF-8格式,这样乱码问题又解决了。
可是,每次编写UTF-8程序时都要去网页上改编码格式吗?这样明显不可能的。
既然HTTP响应有对浏览器说明回送数据是什么类型的消息头,那么HttpServletResponse对象就应该有相对应的方法告诉浏览器回送的数据编码格式是什么
于是乎就去查找Servlet API,找到了设置消息头的方法
//设置头信息,告诉浏览器我回送的数据编码是utf-8的
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.getOutputStream().write("你好呀我是中国".getBytes("UTF-8"));
浏览器在显示数据时,自动把页面的编码格式置换成UTF-8,乱码问题也解决了
由于Tomcat是外国人的写,Tomcat默认的编码是ISO 8859-1,当我们输出中文数据的时候,Tomcat会依据ISO 8859-1码表给我们的数据编码,中文不支持这个码表呀,所以出现了乱码
既然如此,我设置一下编码不就好了吗,代码如下:
//原本是ISO 8859-1的编码,我设置成UTF-8
response.setCharacterEncoding("UTF-8");
当没有指定request的编码方式时,从客户端得到的数据是ISO-8859-1编码的