项目开发中经常会遇到输出中文,然后出现乱码的问题。为了杜绝发生这种低级问题,我们需要了解乱码的缘由。
输出中文有两种情况,一个是字节输出:
字符输出时:
为了方便不熟悉各种响应头的开发人员,或者简化开发,java提供了setContentType(),可以直接设置content-type值:
事实上,setContent-Type()的内部,已经包含response.setCharacterEncoding("****"),但为了体现设置两处参照码表一致的思路,建议还是写上response.setCharacterEncoding("****")这一句。
而当字节输出时,
由于将字符转为字节的过程由自己控制,其参照编码也由自己给定,所以不必再设置response的CharacterEncoding。
总之,了解了乱码的根由,我们杜绝乱码的手段就是控制两次参照的码表一致。
输出中文有两种情况,一个是字节输出:
String data = "中国";
OutputStream out = response.getOutputStream();
out.write(data.getBytes());
out.close();
一个字符输出:
String data = "中国";
PrintWriter writer = response.getWriter();
writer.write(data);
writer.close();
有时候,页面会正确显示中文数据。正确显示的原因是运气。为什么说是运气,我们了解一下服务器将数据传输给浏览器的过程。服务器首先会参照某种码表将字符数据转化为字节数据(如果我们是以字符输出),然后交给浏览器,然后浏览器参照某种码表解析数据,在页面显示出来,由此可以看出如果前后参照的两种码表一致,则会正确显示。但事实上,如果采用字符输出,则会默认以iso8859-1解析,而浏览器根据本地系统常用编码会采用中文码表gbk或者gb2312,两者不一致,显示乱码。
由此,为了控制正确显示,我们需要将参照的两种码表都给他确定了。字符输出时:
String data = "中国";
//设置response采用何种编码将字符解析成字节数据
response.setCharacterEncoding("utf-8");
//设置响应头Content-Type,从而告诉浏览器以何种编码解析页面
response.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(data);
writer.close();
为了方便不熟悉各种响应头的开发人员,或者简化开发,java提供了setContentType(),可以直接设置content-type值:
String data = "中国";
//设置response采用何种编码将字符解析成字节数据
response.setCharacterEncoding("utf-8");
//设置响应头Content-Type,从而告诉浏览器以何种编码解析页面
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(data);
writer.close();
事实上,setContent-Type()的内部,已经包含response.setCharacterEncoding("****"),但为了体现设置两处参照码表一致的思路,建议还是写上response.setCharacterEncoding("****")这一句。
而当字节输出时,
String data = "中国";
response.setHeader("Content-Type", "text/html;charset=utf-8");
OutputStream out = response.getOutputStream();
//手工参照码表将data转为字节数据
out.write(data.getBytes("utf-8"));
out.close();
由于将字符转为字节的过程由自己控制,其参照编码也由自己给定,所以不必再设置response的CharacterEncoding。
总之,了解了乱码的根由,我们杜绝乱码的手段就是控制两次参照的码表一致。