一、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. 标准C程序设计七---102

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  2. 标准C程序设计七---32

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. jquery鼠标点击窗口或浮动层以外关闭层【阻止冒泡事件】

    $(".up-list a.th1").click(function(){ $(this).next("ul#up-list-ul").show(); }); ...

  4. JVM, JRE 和JDK

    JVM -- java virtual machine A Java virtual machine (JVM) is a process virtual machine that can execu ...

  5. ubuntu和raspberry下调试python_spi备忘

    Ubuntu12.04 自安装python3.3中头文件Python.h路径:usr/local/python3.3/include/python3.3m Ubuntu12.04 自带的Python2 ...

  6. Xamarin XAML语言教程对象元素的声明方式

    Xamarin XAML语言教程对象元素的声明方式 XAML的对象元素的声明有两种形式,分别为包含属性的特性语法形式以及对象元素语法形式.在1.4小节中,我们看到了其中一种对XAML对象元素的声明方式 ...

  7. 使用一个数组存储一个英文句子"java is an object oriented programing language"

    class fun { public static void main(String[] args) { String str="java is an object oriented pro ...

  8. Xcode: This device is no longer connected error

    Quit the xcode and connect again will all right.

  9. Android Studio 删除项目

    在项目上右键 点击“Open Module Settings”,然后你会看到你的项目排成一列,如果想删除哪个,点击项目,然后在左上角,点击“-”号,然后返回后发现这个项目变为灰色,点击项目右键,看到“ ...

  10. Go -- LFU类(缓存淘汰算法)(转)

    1. LFU类 1.1. LFU 1.1.1. 原理 LFU(Least Frequently Used)算法根据数据的历史访问频率来淘汰数据,其核心思想是“如果数据过去被访问多次,那么将来被访问的频 ...