输出中文的解决方式

项目开发中经常会遇到输出中文,然后出现乱码的问题。为了杜绝发生这种低级问题,我们需要了解乱码的缘由。

输出中文有两种情况,一个是字节输出:
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。

总之,了解了乱码的根由,我们杜绝乱码的手段就是控制两次参照的码表一致。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值