最近在做Ajax ,就利用Servlet与jsp实验ajax。
实验开始很顺利,但是在输入中文和服务器返回中文时,出现乱码,全部都显示?????
在最开始学习jsp的时候对中文乱码不明白。借此机会写一篇博客对中文乱码与编码写下自己的理解。
1.编码
在计算机中,因为计算机只能表示0与1,所以英文字母与汉字都不能直接让为计算机理解。编码就是为了解决这个问题。他通过人为的规定顺序,确定一个字符唯一的一种表达。
但是,由于人们有很多种想法,所以有很多种编码形式。例如:ASCII ISO-8859-1 GB2312 utf-8等等。
2.java中的编码与解码
在java中对字符的编码最简单的形式是 String类中的getBytes(String charsetName)方法,在里面传入字符集。他将String里面的内容通过传入的字符集,编码成字节数组。这样就可以通过序列化写入到硬盘与进行网络通信。
在java中解码的一种途径是通过String类的构造方法。String(byte[] bytes,String charsetName),这个构造方法通过字符集名解码输入的字节数组。意思是通过解码字符集将byte[]—>char[]
3web乱码问题
在web的乱码问题,大多都是由于错误的编码与解码。所以解决乱码问题。需要从编码与解码入手。
比如页面
<%@ page contentType = " text/html;charset=utf-8 " %>
<form >
姓名:<input id="name" type="text"/><br>
密码:<input id="password" type="password" /><br>
<input id="submit" type="submit"/>
</form>
第一行表示此页面的编码是utf-8所以中文正常显示。
并且他默认向服务器发送数据的格式也是采用utf-8编码
这样在服务器端应该获取也以utf-8解码。
但是在服务器默认情况会以iso-8859-1进行解码。所以需要手动的对它进行在编码与解码。
String name=new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");
此name字符串的编码解码过程
这样中文字符串就可以正常显示了。
服务器端向客户端发送
以最简单的方式
printWriter.write(String str);
的方式写入一段字符串发送回客户端。
在这里首先要设置客户端解析的编码格式
response.setHeader("Content-Type","text/html;charset=gb2312");
这样服务器向客户端传回信息后,客户端会以GB2312的编码格式进行解码。
同样。在服务器端,服务器会默认的采用iso-8859-1的格式进行编码。所以如果没有提前对字符串进行处理。那么发回给客户端的将会是一堆??????。
byte[] bytes = str.getBytes("gb2312");
String returnstring = new String(bytes,"ISO-8859-1");
Str的编码解码过程
第二部进行解码是为了应对下一步服务器的编码。
让其对byte[]数组转换的char[]进行编码就不回超出字符的表示范围。
比如:一个汉字两个字节表示,但是由ISO-8859-1编码,它会将2字节转换为1字节的字符。所以不会出现丢失字符。
这样哪怕有2个字符集同时存在。也不会出现问题。
这样从服务器端和客户端的通信中文就没有问题了。