你的位置:首页 > Java教程

[Java教程]Servlet向客户端发送中文数据的编码情况


(更多内容请关注本人微信订阅号:it_pupil)

 

本文讲述服务端servlet向客户端浏览器发送中文数据的编码情况,需要抓住下面几点:

 

输出流发送数据,必须是以字节形式传输的。也就是说,如果你在服务端定义一个字符串,那么servlet要先编码成字节数组,再发送到客户端。

 

客户端浏览器在收到字节码数据时,需要将其解码成字符串显示出来。

 

在服务端,如果你使用的是字节流,那么只需要注意两点:

 

   拿到字符串,以特定形式编码成字节数组(如UTF-8)。(字节数组是你人工转换的)

 

   告诉浏览器,以相同方式解码显示(UTF-8)。

 

如果你使用的是字符流,那么需要注意三点:

 

   字符流其实就是你传给它的是字符,它自己内部还是会转换成字节的。

 

  拿到字符串,告诉服务端,发送时以特定方式编码成字节数组(如UTF-8)。(字节数组是字符流内部转换的)

 

  告诉浏览器,以相同方式解码显示(UTF-8)。

 

就上面提出的几点,有三种实现方案保证不乱码(也是乱码的解决思路):

 

方案一,字节流:

 

 

方案二,字符流:

 

 

方案三,还是字符流:

 


 

方案三其实可以像下面模拟一下编解码的过程(toHex方法是把字节数组以16进制形式输出):

 

 

所以,方案三的关键之处在于,一开始用UTF-8编码,最后用UTF-8解码,这是本质。

 

虽然ISO-8859-1是单字节编码,但是,一开始用UTF-8编码后,你用ISO-8859-1解码,它会一个字节一个字节去解开,而UTF-8表示的汉字,一个汉字是三个字节,当然会乱码。

 

但是乱码不要紧啊,这个乱码只是个中间过程,不需要显示出来。紧接着用ISO-8859-1再编码,那么,编码出的字节是跟UTF-8编码的字节是相同的。

 

如此,最后再用UTF-8去解码,完美!

 


 

本文是关于编码分析的第5篇,原文地址:

http://mp.weixin.qq.com/s?__biz=MzIyNzUzNjQ3MA==&tempkey=37C%2F%2BA4Bi9W%2F7a0wo%2B56WiBFhphFwjbCfb6TgA3OcQ4v4JbKjTBmxOQLMoZldKoCJeAi%2BhxmRuBUwSzp7yjZCA2k5X%2BXxzpE3hD%2BaLWechfiCfr797hJOnJt29Rqr9eM5KF3ZKZOmQ%2FeJGYzG8vXRQ%3D%3D&#rd

 更多内容请关注相关订阅号查看。