81,122
社区成员




write(abc.getBytes("GB2312"));
String str=new String(read(),"GB2312");
String str=new String(read(),"utf-8");
<%@ page language="java" pageEncoding="utf-8" %>
write(abc.getBytes("GB2312"));
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
</head>
<body>
<form action="main.jsp" method="GET">
First Name: <input type="text" name="first_name">
<br />
Last Name: <input type="text" name="last_name" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
main.jsp
<%@ page contentType="text/html; charset=GB2312"%>
<%
request.setCharacterEncoding("gb2312");
%>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<title>Using GET and POST Method to Read Form Data</title>
</head>
<body>
<center>
<h1>Using GET and POST Method to Read Form Data</h1>
<ul>
<li><p>
<b>First Name:</b>
<%=request.getParameter("first_name")%>
</p></li>
<li><p>
<b>Last Name:</b>
<%=request.getParameter("last_name")%>
</p></li>
</ul>
</center>
</body>
</html>
byte[] str=new String(read(),"gb2312").getByte();//str就直接返回给java
也就是说数据库把java传递的字节流视为gb2312保存起来,(保存的编码是数据库自己定义的)最终返回给java的是unicode编码,所以转码过程不需要再由java进行,否则转码两次有可能会出现乱码.
那么对于上面的表单提交的情况,保存数据库的页面来说只需要
<%@ page contentType="text/html; charset=gb2312"%>//再次注明这个编码要和下面html编码一致
<%
String str=request.getParameter("name");
str=new String(str.getBytes("ISO-8859-1"),"");//ISO-8859-1要与Tomcat设置的一样,gb2312要和发送页面设置的提交表单编码一致,
save(str);//str被转为原来的gb2312编码
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
保存成功
</body>
</html>
从数据库取数据的时候只需要:
<%@ page contentType="text/html; charset=gb2312"%>//再次注明这个编码要和下面html编码一致
<%
String str=readdatabase();//数据库自动帮助我们转为unicode编码,我们无需再转码,只需要返回数据的时候编码与客户端统一就可以了
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">//这里要和page指令中指定的编码一致。
</head>
<body>
<%=str%>
</body>
</html>
编码有的时候还涉及到发送电子邮件,处理方式和上面的差不多都是采用设置编码字符集。new String(read(),"ISO-8859-1");
当然在Tomcat的conf文件夹的server.xml文件中,可以使用URIEncoding属性设置某个端口的编码格式
<Connector port="8090" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
这里就可以看出问题了,比如上面说的html发送的是gb2312编码而Tomcat却把它当做ISO-8859-1编码,自然会乱码
所以我们需要转码:
String str=request.getParameter("name");
str=new String(str.getBytes("ISO-8859-1"),"gb2312");
因为html发送的时候按照gb2312编码,而Tomcat接收字节流的时候,按照ISO-8859-1解码。
str=new String(str.getBytes("ISO-8859-1"),"gb2312");这句话就反过来,按照ISO-8859-1编码再按照gb2312解码。就这么还原了字符串,
当然更加直接的办法就是
request.seCharacterEncoding ("gb2312");//它相当于使用代码new String(read(),"gb2312");获取客户端传递的字节流
事情到此还没有完,因为java还要返回给客户端,这个时候又要用到jsp的指令的contentType属性
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
这句话是什么意思呢?这句话是说返回给客户端的时候转为gb2312编码,归咎于代码上实质上就是返回给客户端的时候会执行如下代码
write(str.getBytes("gb2312"));
而返回给客户端html的时候,要告诉客户端html的编码,因此要用html告知客户端当前页面编码:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
此时客户端相当于执行了
String str=new String(read(),"gb2312");//这样获取服务器端返回的数据
这样编码就统一了,于是接受页面代码就变成了:
<%@ page contentType="text/html; charset=gb2312"%>//再次注明这个编码要和下面html编码一致
<%
String str=request.getParameter("name");
str=new String(str.getBytes("ISO-8859-1"),"gb2312");//ISO-8859-1要与Tomcat设置的一样,gb2312要和发送页面设置的提交表单编码一致,
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">//这里要和page指令中指定的编码一致。
</head>
<body>
<%=str%>
</body>
</html>