要想搞清楚如何解决编码首先要明白,在网络上传递数据的时候传递都是byte[]字节,这里我用write方法代表输出字节流,read代表读入输入流。众所周知java内部的编码是unicode编码,而最终计算机系统内部是转为机内码,也就是说所有的编码在计算机内部处理的时候都要转为机内码,计算机才识别它.而对于java最终显示到操作系统中的时候自然会自动转为机内码
那么当你想把字符串以一种编码格式传递的时候,就需要用到String类的getBytes方法将字符串转为相应编码的字节流。例如:
write(abc.getBytes("GB2312"));
这就是说把字符串abc从unicode编码转为GB2312
那么对于接收端必须这么接收:
String str=new String(read(),"GB2312");
即将传递过来的字节流视为GB2312编码转为unicode构造为字符串str
如果变为
String str=new String(read(),"utf-8");
那么自然会出现编码错误,因为发送的是GB2312编码,你却把它当做utf-8编码,自然就乱了。
造成乱码的基本原理是这样,实际jsp开发问题如下:(前台用html代码,还有数据库,我为了方便起见,都用java代码描述它们转码过程,让大家明白整个过程)
首先是jsp或者java文件本身编码,对于jdk来说它也是用unicode编码,那么我们写java文件的时候,如果使用的是操作系统的txt文件就会保存为操作系统的编码格式(有的系统允许指定相应编码保存文件)。当然一般程序中很少有中文,而英文基本上编码一致,而jdk编译为class文件的时候会转为unicode编码,虚拟机自然以unicode编码解析它,执行它。当然对于变量 属性方法 类命名我们一般使用英文,对于字符串常量中的中文我们可以使用java的转义字符\u+(4位的中文的unicode编码)表示,当然这样很麻烦,还要编码。
不过如果使用eclipse等软件就可以设置保存的文件编码,软件编译之前会帮助我们转码为unicode,导入其它java文件的时候也可以指定它的编码格式为保存它时用的编码格式.
不过在jsp中,jsp文件是在被使用的时候被解析,需要告诉服务器当前文件的编码格式,这个 就需要jsp的page指令的pageEncoding属性告诉服务器这个文件的编码格式
<%@ page language="java" pageEncoding="utf-8" %>
接下来是发送和接收数据.
首先是html提交表单,通常提交表单的时候字符集使用的是页面的字符集例如:
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">//这里指定页面字符集
</head>
<body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
在发送的时候,实际上是做了这样的操作:
write(abc.getBytes("GB2312"));
当然你也可以指定form表单提交时用的字符集:
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form name="form1" method="post" action="process.jsp" accept-charset="GBK">//这里指定提交表单的字符集
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>