jsp 页面常见的中文乱码问题总结

来源:互联网 发布:傅园慧网络直播 编辑:程序博客网 时间:2024/05/02 04:35
一、JSP页面显示乱码
1.jsp页面编码问题:
默认的jsp页面编码是iso8859-1编码的,<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 把它改成UTF-8.
2 jsp页面编码与解码不一致:
默认的jsp页面解码是ios8859-1编码的,<%@ page contentType="text/html;charset=UTF-8"%> 把它改成UTF-8,同时还要把jsp页面编码方式改成UTF-8,<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 把它改成UTF-8.
注意点:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 这条语句经常也看见用于解决jsp中文乱码问题,其作用是告诉浏览器以UTF-8编码方式查看该jsp文件。
总结:
第一处<%@ page language="java" pageEncoding="gb2312"%>的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字
第二处编码为解码格式。因为存为gb2312的文件被解码为iso8859-1,这样如有中文肯定出乱码。也就是必须一致。而第二处所在的这一行,可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有这一行的话,也会出现乱码。必须一致才可以。。总之用jsp进行页面显示,最好包含这两行代码:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  <%@ page contentType="text/html;charset=UTF-8"%>,有时候myeclipse只会有前面一行代码,没有后面一行代码,不加上后面代码的话,默认页面的解码过程是按ISO8859-1执行的。

二、表单提交中文时出现乱码
1.下面是一个提交页面(submit.jsp),代码如下:
<%@ page contentType="text/html; charset=utf-8"%>
 <html>
<head><title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form name="form1" method="post/get" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
下面是处理页面(process.jsp)代码: 
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:表单里的数据是以post方式提交,通过request对象去接收,而request对象默认情况下对接收到的数据是以iso8859-1解码的,而表单的数据是以utf-8编码的,编码和解码过程不一致,所以就出现了乱码问题
?POST提交方式
解决办法:
A、接受参数时进行编码转换
String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8") ; 
B、通过request.seCharacterEncoding ("utf-8")对请求进行统一编码,就实现了中文的正常显示。
修改后的process.jsp代码如下: 
复制代码
<%@ page contentType="text/html; charset=gb2312"%>
<%request.seCharacterEncoding("gb2312");%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
C、为了避免每页都要写request.setCharacterEncoding("gb2312"),可以使用过滤器对所有jsp
进行编码处理。就是使用Servlet规范中的过虑器指定编码,主要代码如下:
import java.io.*;
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null; 
public void destroy(){ 
this.encoding = null; 

public void init(FilterConfig filterConfig) throws ServletException
{
 this.encoding = filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}
}
过滤器在web.xml中的配置如下:
复制代码
<filter>
<filter-name>SetCharacterEncodingFilter</filter-name>
<filter-class>SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以上方法只对POST方式提交有效果。
?GET提交方式
如果使用get方式提交中文,接受参数的页面也会出现乱码,这个乱码的原因也是tomcat的内部编码格式iso8859-1导致。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致接受页面得到的参数为乱码。
解决办法:
A、 使用POST提交方式解决办法的第一种方式,对接受到的字符进行解码,再转码。
B 、首先配置tomcat下server.xml的Connector节点增加useBodyEncodingForURI="true"属性配置,然后在JSP页面中加入<%request.seCharacterEncoding("utf-8");%>所设置的编码格式进行编码。
1、Tomcat中server.xml配置如下:
复制代码
<Connector port="8080" protocol="HTTP/1.1" 
connectionTimeout="20000" 
redirectPort="8443" 
useBodyEncodingForURI="true"

/>

注意tomcat默认编码格式是iso8859-1,所以一般表单传递数据(中文)到服务器上处理后就会出现乱码,所以在server.xml中

<Connector port="8080" protocol="HTTP/1.1" 
connectionTimeout="20000" 
redirectPort="8443" 
useBodyEncodingForURI="true"

URIEncoding="UTF-8"

/>加入红色部分即可解决;

复制代码
2、修改后的process.jsp代码如下: 
<%@ page contentType="text/html; charset=utf-8"%>
<%request.seCharacterEncoding("utf-8");%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
三、数据库连接出现乱码
这种乱码会使你插入数据库的中文变成乱码,或者读出显示时也是乱码,解决方法如下:  在数据库连接字符串中加入编码字符集 
String Url=" jdbc:sqlserver://localhost:1433; DataBaseName=mydb;user=sa&password=sa&useUnicode=true&characterEncoding=utf=8"; 
 并在JSP页面中使用如下代码:
response.setContentType("text/html;charset=utf-8");  request.setCharacterEncoding("utf-8");
四、关于jsp在MyEclipse中打开的乱码问题
对于一个已经存在的项目,Jsp文件的存储格式可能是utf-8。如果新安装的eclipse,则缺省打开使用的编码格式可能iso8859-1。所以导致 jsp里面的汉字出现乱码。这个乱码鱼解决方式如下:
A、Myeclispe Window - > Preferences弹出属性窗口
General - > Workspace 设置Text file encoding 全局设置。
B、右键你的项目---属性---Text file encoding 项目设置
五、关于html页面在eclipse中打开出现乱码情况
由于大部分页面都是由dreamweaver制作,其存储格式跟eclipse的识别有差别导致。
一般这种情况,在eclipse中新建一个jsp,直接从dreamweaver复制页面内容粘贴到jsp即可。
六、JSP页面通过URL传递中文参数的乱码问题
在项目中,我们经常遇到需要在jsp页面切换中传递中文字符。例如:http://website/test1.jsp?act=add&type=苹果
?一般来说我们很少直接在URL里面把参数写成中文,如例子中的"type=苹果"这样传递。如果出现这种情况,在我们的接收参数的页面我们只需要做个简单的转换就可以了。 
代码test1.jsp:(主要部分)
   
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String type = request.getParameter("type");
String result = new String(type.getBytes("iso-8859-1"), "gb2312");
out.println(result);
%>
?更普遍的做法,就是对url中的中文字符进行编码,变成类似type=%20D%20B这样的字符。
代码MyJsp1.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>


<%@ page import="java.net.*" %>
<a href='./MyJsp2.jsp?act=<%=URLEncoder.encode("中国人 非常好")%>'>test</a>
代码MyJsp2.jsp:
复制代码
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page import="java.net.*" %>
<%
String tempVal = URLDecoder.decode(request.getParameter("act"));
out.println(new String(tempVal.getBytes("ISO-8859-1"), "gb2312"));
%>

0 0
原创粉丝点击