JavaWeb编码和乱码解决方法

来源:互联网 发布:坛水墨水官网淘宝 编辑:程序博客网 时间:2024/05/21 10:25

为什么会出现乱码

我们知道,计算机数据只能是二进制的,数值类型的数据转换成二进制很简单,我们已经了解了,但字符类型如何转换成二进制呢?它需要一定的规则,而这些就是编码表!

字符按照某种编码表转换成二进制格式称为编码而把二进制按某种编码表还原成字符称为解码若编码和解码两个过程参照的编码表不一样,这是就会产生乱码


无论浏览器发送过来的是什么编码的数据,Tomcat都默认使用ISO-8859-1来解码,ISO-8859-1是不支持中文的!!!


请求编码

①若浏览器的地址栏中请求的URL含有中文请求参数

中文按照浏览器规定的编码表进行编码,不同的浏览器使用不同的编码。

  • IE:使用UTF-8;
  • FireFox:使用GB2312;
  • Chrome:使用UTF-8;
浏览器的编码方式都可以自己设定

②在页面中发出请求

客户端首先要打开一个页面,然后在页面中提交表单或点击超链接!在请求这个页面时,服务器响应的编码是什么,

那么客户端发送请求时的编码就是什么。

响应编码

当响应的是字符数据时,我们必须要考虑编码的问题。

例如:response.getWriter( ).println("张"); 在默认情况下,“张”在服务器端会按照默认的ISO-8859-1来编码,那么在浏览器中显示的一定是乱码。所以我们自己要指定“张”的编码按照UTF-8格式(或其他支持中文的编码)。此时,我们还不能保证不会出现乱码,因为不同的浏览器会按照自己的默认编码表来进行解码,故我们还要指定浏览器对“张”的解码必须也是UTF-8(或其他支持中文的编码)。

URL编码

通过页面传输数据给服务器时,如果包含了一些特殊字符是无法发送的。这时就需要先把要发送的数据转换成URL编码格式,再发送给服务器。其实需要我们自己动手给数据转换成URL编码的只有GET超链接,因为表单发送数据会默认使用URL编码(Tomcat会自动URL解码,例如:req.getParameter(),但若是自己通过IO流解析字节数据,则Tomcat不会自动URL解码),也就是说,不用我们自己来编码。

 URL编码需要先指定一种字符编码,把字符串解码后,得到byte[ ],然后把小于0的字节+256,再转换成16进制。前面再添加一个%。形如:%AE%6B%1E

URL编码:String username = URLEncoder.encode(username, "utf-8");

URL解码:String username = URLDecoder.decode(username, "utf-8");

五、乱码解决办法

Get请求:没有方法可以设置它,因为参数在url中。所以使用request.getParameter()获取到的数据一定是错误的使用了iso-8859-1解码的。可以再使用iso-8859-1把字符串转回到byte[],再重新使用正确的编码来解码即可。

String s = request.getParameter("s");//使用iso-8859-1错误的解码了
  byte[] bytes = s.getBytes("iso-8859-1");//退回错误的解码,让字符串通过iso-8859-1返回到字节数据,即还原字节数据
  s = new String(bytes, "utf-8");//重新使用正确的utf-8来解码。

POST请求:

request.setCharacterEncoding(“utf-8”); //设置服务器端的解码方式

String name =request.getParameter(“name”);

响应:
response.setContentType(“text/html;charset=utf-8”);          //不仅指定浏览器解码方式,同时指定了服务器的编码方式。

response.getWriter().print(“张”);



0 0