一、JSP页面中文乱码

在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。

先看一个JSP程序:

  1. <%@ page language="java" import="java.util.*"  %>
  2. <html>
  3. <head>
  4. <title>中文显示示例</title>
  5. </head>
  6. <body>
  7. 这是一个中文显示示例:
  8. <%
  9. String str = "中文";
  10. out.print(str);
  11. %>
  12. </body>
  13. </html>
<%@ page language="java" import="java.util.*"  %>
<html>
<head>
<title>中文显示示例</title> </head>
<body>
这是一个中文显示示例:
<%
String str = "中文";
out.print(str);
%>
</body>
</html>

上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。运行后在浏览器中显示如图所示

原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代码中page命令修改成如下所示即可

  1. <%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" %>
  2. <html>
  3. <head>
  4. <title>中文显示示例</title>
  5. </head>
  6. <body>
  7. 这是一个中文显示示例:
  8. <%
  9. String str = "中文";
  10. out.print(str);
  11. %>
  12. </body>
  13. </html>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %>
<html>
<head>
<title>中文显示示例</title> </head>
<body>
这是一个中文显示示例:
<%
String str = "中文";
out.print(str);
%>
</body>
</html>

再次运行乱码消失,原理就是向页面指定编码为UTF-8,那么页面就会按照此编码来显示,于是乱码消失。

二、URL传递参数中文乱码

一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。

下面是一个示例程序

  1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8"%>
  2. <html>
  3. <head>
  4. <title>URL传递参数中文处理示例</title>
  5. </head>
  6. <%
  7. String param = request.getParameter("param");
  8. %>
  9. <body>
  10. <a href="URLCharset.jsp?param='中文'">请点击这个链接</a><br>
  11. 你提交的参数为:<%=param%>
  12. </body>
  13. </html>
<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>URL传递参数中文处理示例</title>
</head>
<%
String param = request.getParameter("param");
%>
<body>
<a href="URLCharset.jsp?param='中文'">请点击这个链接</a><br>
你提交的参数为:<%=param%>
</body>
</html>

上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图

对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下

  1. <Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
  2. connectionTimeout="20000"
  3. redirectPort="8443" />
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312"
connectionTimeout="20000"
redirectPort="8443" />

在原来代码中添加URI编码设置URIEncoding=“UTF-8”即可,重启Tomcat服务器可以得到正确的页面。其原理也和上面的情况类似,就是向程序指明编码类型,然后显示就正常了。

三、表单提交中文乱码

对于表单的数据可以使用request.getParameter(“”)的方法获取,但是当表单中出现中文数据的时候就会出现乱码。

示例代码如下

  1. <%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8"%>
  2. <html>
  3. <head>
  4. <title>Form中文处理示例</title>
  5. </head>
  6. <body>
  7. <font size="2">
  8. 下面是表单内容:
  9. <form action="AcceptFormCharset.jsp" method="post">
  10. 用户名:<input type="text" name="userName" size="10"/>
  11. 密  码:<input type="password" name="password" size="10"/>
  12. <input type="submit" value="提交">
  13. </form>
  14. </font>
  15. </body>
  16. </html>

在上面的表单当中想AcceptFormCharset这个页面提价两项数据,下面是AcceptFormCharset.jsp的内容:

  1. <%@ page language="java" import="java.util.*"
  2. contentType="text/html;charset=UTF-8"%>
  3. <html>
  4. <head>
  5. <title>Form中文乱码</title>
  6. </head>
  7. <body>
  8. <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>
  9. <%
  10. String userName = request.getParameter("userName");
  11. String password = request.getParameter("password");
  12. out.println("表单输入userName的值:" + userName + "<br>");
  13. out.println("表单输入password的值:" + password + "<br>");
  14. %>
  15. </font>
  16. </body>
  17. </html>

在上面的程序中,如果表单输入没有中文,则可以正常的显示当输入的数据中有中文的时候,得到的结果如图所示。

产生种结果的原因是Tomcat中对于post方法提交的表单采用的默认编码为ISO-8859-1,而这种编码格式不支持中文字符。对于这个问题可以采用转换编码格式的方法来解决,现在对AcceptFromCharset这个页面改动如下:

  1. <%@ page language="java" import="java.util.*"
  2. contentType="text/html;charset=gb2312"%>
  3. <html>
  4. <head>
  5. <title>Form中文乱码</title>
  6. </head>
  7. <body>
  8. <font size="2"> 下面是表单提交以后用request取到的表单数据:<br>
  9. <%
  10. String userName = request.getParameter("userName");
  11. String password = request.getParameter("password");
  12. out.println("表单输入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "UTF-8")+ "<br>");
  13. out.println("表单输入password的值:" + new String(password.getBytes("ISO-8859-1"), "UTF-8")+ "<br>");
  14. %>
  15. </font>
  16. </body>
  17. </html>
<%@ page language="java" import="java.util.*"
contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>Form中文乱码</title>
</head>
<body>
<font size="2"> 下面是表单提交以后用request取到的表单数据:<br>
<%
String userName = request.getParameter("userName");
String password = request.getParameter("password");
out.println("表单输入userName的值:" + new String(userName.getBytes("ISO-8859-1"), "gb2312")+ "<br>");
out.println("表单输入password的值:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>");
%>
</font>
</body>
</html>

经过这样的转换编码以后,所有的中文输入都可以用request对象正常取出。在上面这个程序中,第四行和第五行是转换编码格式的关键,先从ISO-8859-1格式的字符串中取出字节内容,然后在用UTF-8的编码格式重新构造一个新的字符串。这样就可以支持中文变淡输入的正常取值和显示。改进以后程序运行结果如下

经过上面的更改编码格式的处理,表单的中文输入乱码问题已经得到解决。但是如果上面的表单中的输入项不止是两个,那么每个输入项都需要进行编码转换,那样就很麻烦了。这是我们就用到过滤器filter了。下面简单介绍一下。

package com.foxmail.xxy668;

import java.io.IOException;

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 FilterConfig filterConfig;
protected String encodingName;
protected boolean enable; @Override
public void destroy() {
// TODO Auto-generated method stub } public SetCharacterEncodingFilter() {
this.encodingName="UTF-8";
this.enable=false;
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if(this.enable){
request.setCharacterEncoding(this.encodingName);
}
chain.doFilter(request,response);
} @Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
loadConfigParams();
} private void loadConfigParams(){
this.encodingName=this.filterConfig.getInitParameter("encoding");
String strIgnoreFlag=this.filterConfig.getInitParameter("enable");
if(strIgnoreFlag.equalsIgnoreCase("true")){
this.enable=true;
}else{
this.enable=false;
}
}
}

在上面的这个过滤器中,init方法从配置文件中取出字符编码格式的参数,在doFilter方法中使用request对象对所有的请求统一编码格式。

四、Eclipse中JSP文件中文乱码

在Eclipse或者MyEclipse中由于默认的JSP编码格式为ISO-8859-1,所以当打开由其他编辑器编辑的JSP文件时会出现乱码,如图所示

对于这个问题我们只需要更改一下Eclipse或者是MyEclipse中对JSP的默认编码就可以了,修改的地方(我的MyEclipse版本为11)如图所示

jsp页面中文乱码解决方案的更多相关文章

  1. 如何彻底解决jsp页面中文乱码及数据库乱码

    最近自己闲做一个小项目,搭建环境框架SSH+MySQL数据库,遇到一个问题:jsp页面中文显示乱码,数据库插入数据和更新数据时中文也显示乱码,后来在网上找了许多解决方法,还是折腾了两天才把问题解决,下 ...

  2. 分享url带中文参数,打开html操作完毕跳转jsp页面中文乱码解决

    1.在app端分享参数组合时不对传递的url进行任何编码. 2.打开html页面时使用 escape函数对有中文的参数进行编码 escape(GetQueryString("paramete ...

  3. JSP页面中文乱码

    近期搭建了一个JAVA WEB项目,引入了国际化的ResourceBundle. 顺便赞一个,Eclipse Mars,自带了中文转unicode编码的功能. ① 根据语言选择,初始化Resource ...

  4. JSP页面中文乱码问题

    $.get()方法到服务器端中文乱码 在jsp页面使用encodeURI(“中文”),在服务器端进行解码 String name = req.getParameter("name" ...

  5. 解决JSP页面中文乱码插入到数据库的问题

    在JSP页面使用表单注册一个用户名的时候,查看到数据库里面的表中文显示乱码的情况有两种: 1.JSP页面传进来的参数中文就是乱码,则是前台的问题,这个时候写一个过滤器就好了,可以写如下的一个过滤器 p ...

  6. 1、spring mvc jsp页面中文乱码

    jsp 页面头部 的page标签中加个 contentType="text/html;charset=utf-8"

  7. JSP中pageEncoding和charset区别,中文乱码解决方案(转载)

    转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...

  8. aspx页面,中文乱码解决方案

    由于文件编码方式编码方式不统一出现样式中文乱码解决方案: 今天碰到的问题:页面字体样式设置的'微软雅黑',可页面没引用.我调试看到样式出现中文乱码了 这种问题,就需要转换文件的编码方式,如下两步即可解 ...

  9. (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全

    JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...

随机推荐

  1. andriod多线程

    用ThreadHandle可以实现多线程,然后再主线程更新UI 第二种就是用 AsyncTask 具体看代码 public void onClick(View v) { new DownloadIma ...

  2. LeetCode OJ——Longest Valid Parentheses

    http://oj.leetcode.com/problems/longest-valid-parentheses/ 最大括号匹配长度,括号是可以嵌套的 #include <string> ...

  3. echarts 金字塔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Java 基础【03】序列化和反序列化

    当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收方则需要把字节序列再 ...

  5. guava之cache

    转自:http://ifeve.com/google-guava-cachesexplained/ 范例 01 LoadingCache<Key, Graph> graphs = Cach ...

  6. 服务器SSL/TLS快速检测工具TLLSSLed

    服务器SSL/TLS快速检测工具TLLSSLed   现在SSL和TLS被广泛应用服务器的数据加密中,如网站的HTTPS服务.所以,在渗透测试中如何快速检测服务器的SSL和TLS配置寻找安全漏洞,就显 ...

  7. win10下ubuntu虚拟机互传文件

    前言 用过虚拟机的都知道在向linux传文件的时候总是会遇到各种问题 安装虚拟机的增强工具不好用,反正就是各种麻烦各种麻烦 准备-------方案一 使用专门的xshell可以直接链接到虚拟机,同时配 ...

  8. spring security 单一账户多地方登陆提醒, ajax 拦截器 Interceptor

    spring-security.xml部分代码: <http auto-config="false" > <access-denied-handler ref=& ...

  9. POJ2104Kth Number

    整体二分模板题, 有些细节需要注意 #include<cstdio> #include<cctype> #include<climits> #include< ...

  10. DAO 层实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 MyBatis 框架实现 DAO 层. 1.2 实验知识点 MyBatis 框架 MySQL 1.3 实验环境 JDK1.8 Eclipse Java ...