
解决中文JSP乱码的问题
在JSP开发过程中,经常会出现中文乱码的问题,这可能会立即困扰每个人. 现在编写JSP开发中遇到的中文乱码问题和解决方案,以供您参考. 首先了解Java中文问题的起源:
Java的内核和类文件基于unicode,这使得Java程序具有良好的跨平台性,但同时也带来了中文乱码问题. 造成这种情况的主要原因有两个: 编译Java和JSP文件本身时产生乱码问题,以及Java程序与其他媒体进行交互时产生乱码问题. 首先,Java(包括JSP)源文件可能包含中文,并且Java和JSP源文件是基于字节流保存的. 如果将Java和JSP编译到类文件中,则使用的编码方法和源文件如果编码不一致,则会出现乱码. 基于此乱码,建议不要在Java文件中编写中文(注释部分不参与编译,可以编写中文),如果必须编写,请尝试使用-ecoding GBK或-ecoding参数手动编译gb2312或-ecoding UTF-8;对于JSPjsp页面乱码,添加<%@页面contentType =“ text / html; charset = GBK”%>或
<%@页面contentType =“ text / html; charset = gb2312”%>基本上可以解决此类乱码问题.
以下是一些常见的中文乱码问题的解决方案(以下示例中的编码使用gb2312,也可以将其设置为编码GBK或编码UTF-8):
首先,乱码的JSP页面
这种乱码问题相对简单. 通常是由页面编码不一致引起的. 通常,新手都容易出现此类问题. 有两种具体情况:
Ø未指定字符集编码
以下显示页面(display.jsp)出现乱码:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html charset=gb2312">
</head>
<body>
<%out.print("JSP的中文处理");%>
</body>
</html>
此乱码的原因是未指定页面中使用的字符集编码,中文字符出现在JSP页面中,并且默认的ISO-8859-1字符集中没有中文字符. 解决方案: 仅在页面开头使用以下代码指定字符集编码. 在JSP页面中指定编码方法(gb2312),该方法与浏览器解码方法设置相同,即,将其添加到页面的第一行:
<%@页面contentType =“ text / html; charset = gb2312”%>,则可以消除乱码.
完整页面如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html charset=gb2312">
</head>
<body>
<%out.print("JSP的中文处理");%>
</body>
</html>
Ø编码字符集不一致
以下显示页面(display.jsp)出现乱码:

<%@ page language="java" pageEncoding="gb2312"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html charset=gb2312">
</head>
<body>
<%out.print("JSP的中文处理");%>
</body>
</html>
出现乱码的原因是页面编码不一致导致的乱码. 在此示例中,我们可以看到在三个位置设置了字符集. 让我们看一下这三个设置的具体含义:
第一个<%@页面语言=“ java” pageEncoding =“ gb2312”%>的编码格式是jsp文件的存储格式. Eclipse将根据此编码格式保存文件. 并编译包含内部汉字的jsp文件.
第二位被编码为解码格式. 因为另存为gb2312的文件被解码为iso8859-1,所以如果有中文,它将出现乱码. 它必须是一致的. 第二行不是必需的. 缺省值为使用iso8859-1编码格式. 因此,如果没有这一行,也会出现乱码. 必须一致.
第三位是控制浏览器的解码方法. 如果先前的解码是一致且正确的,则无需设置即可使用此编码格式. 某些网页出现乱码,因为浏览器无法确定要使用的编码格式. 由于页面有时嵌入在页面中,导致浏览器混淆编码格式并出现乱码.
完整的解决方案代码如下:
<%@ page language="java" pageEncoding="gb2312"%>
<%@ page contentType="text/html;charset= gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html charset=gb2312">
</head>
<body>
<%out.print("JSP的中文处理");%>
</body>
</html>
以中文提交表单时出现第二个乱码
以下是提交页面(submit.jsp),代码如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head><title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</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=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp正确提交了英文字符,那么如果您提交中文,则会出现乱码. 原因: 浏览器默认使用UTF-8编码方法发送请求,并且UTF-8和GB2312编码方法指示不同的字符,从而出现无法识别的字符.
ØPOST提交方法
解决方案:
A. 接受参数时进行编码转换
String s = new String(request.getParameter(“ name”). getBytes(“ ISO-8859-1”),“ gb2312”);
修改后的process.jsp代码如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;
out.print(s);
%>
</body>
</html>
如果使用此方法,则必须像这样对每个参数进行转码. 很麻烦但是,确实有可能获得汉字.
B. 通过request.seCharacterEncoding(“ gb2312”)对请求进行统一编码,实现了中文的正常显示.
修改后的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”),可以对所有jsps使用过滤器
编码. 是使用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);
}
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-263082-1.html
特别申明
强行驱离
默默祝福你