转载于 http://www.txdnet.cn/essay/view.jsp?tid=155&cid=2[color=red][/color]
关于我对JSP乱码的解决方法,希望对大家有帮助
首先我是统一用UTF-8的编码
Mysql连接字符
jdbc:mysql://YourMySqlServerIp:Port/YourDBName?
autoReconnect=true&useUnicode=true&characterEncoding=UTF8"......
解决mysql数据库乱码
数据库使用UTF8
jsp文件必须用utf-8编辑保存
<%@pagecontentType="text/html;charset=UTF-8"....
<%@pagepageEncoding="UTF-8"%>
<%response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");%>
若使用了usebean或标签还要用
tomcat的自带的encodeFilter来编码请求为UTF-8
ajax里的get需要用JS的encodeURIComponent()编码中文为UTF-8
若为post传值可用JS编码中文为UTF-8
XmlHttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded;charset=UTF-8');
设置POSTAJAX用UTF-8编码
在servlet和javabean编译时记得用javac-encodingUTF-8-source1.5-target1.5*.java
java文件保存为UTF-8格式
servlet里用
response.reset();
response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("UTF-8");
上传用new String(m_binArray,m_startData,(m_endData-m_startData)+1,m_Charset);设置转码
tomcat默认不处理utf-8所以必须在
server.xml里的连接里设置编码
<Connectorexecutor="tomcatThreadPool"
port="80"protocol="HTTP/1.1"
connectionTimeout="30000"
redirectPort="8443" URIEncoding="UTF-8"/>
这样tomcat就能像resin一样使用UTF-8
若不添加设置URIEncoding="UTF-8"则需要使用new String(request.getParameter("cnParam").getBytes("ISO8859-1"),"UTF-8")
转换为utf8编码,若为post,可以不需要转码,但一定要注意form post 表单所在页面一定要是utf-8格式
RESIN不用设置即可接受UTF-8
建议使用UTF-8编码URL或Get中文传值
jsp编码函数类
java.net.URLDecoder.decode(String ChinaUTF-8,String EncodeCharset);解码
java.net.URLEncoder.encode(String ChinaChar,String EncoderCharset);编码
关于JSP的中文乱码说的很多了,然而问题总是要被弄明白的,至少要知道为什么会这样,这里是解决乱码较好的一篇文章,在文章最后附我个人的经历之见.
1, 针对直接在console上运行的类
对于这种情况,我们建议在程序编写时,如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出,程序中应该采用字符流来处理输入和输出,具体来说,应用以下面向字符型节点流类型:
对文件:FileReader,FileWrieter
其字节型节点流类型为:FileInputStream,FileOutputStream
对内存(数组):CharArrayReader,CharArrayWriter
其字节型节点流类型为:ByteArrayInputStream,ByteArrayOutputStream
对内存(字符串):StringReader,StringWriter
对管道:PipedReader,PipedWriter
其字节型节点流类型为:PipedInputStream,PipedOutputStream
同时,应该用以下面向字符型处理流来处理输入和输出:
BufferedWriter,BufferedReader
其字节型的处理流为:BufferedInputeStream,BufferedOutputStream
InputStreamReader,OutputStreamWriter
其字节型的处理流为:DataInputStream,DataOutputStream
其中InputStreamReader和InputStreamWriter用于将字节流按照指定的字符编码集转换到字符流,如:
InputStreamReader in = new InputStreamReader(System.in,"GB2312");
OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");
例如:采用如下的示例JAVA编码就达到了要求:
//Read.java
import java.io.*;
public class Read {
public static void main(String[] args) throws IOException {
String str = " 中文测试,这是内部硬编码的串"+" test english character";
String strin= "";
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //设置输入接口按中文编码
BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //设置输出接口按中文编码
stdout.write("请输入:");
stdout.flush();
strin = stdin.readLine();
stdout.write("这是从用户输入的串:"+strin);
stdout.write(str);
stdout.flush();
}}
同时,在编译程序时,我们用以下方式来进行:
javac -encoding gb2312 Read.java
2, 针对EJB类和不可以直接运行的支持类(如JavaBean类)
由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可.
3, 针对Servlet类
针对Servlet,我们建议用以下方法:
在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输出时的编码部分用response对象的setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式,同样在接收用户输入时,我们用request.setCharacterEncoding("GB2312");这样无论我们的servlet类移植到什么操作系统中,只有客户端的浏览器支持中文显示,就可以正确显示.如下是一个正确的示例:
//HelloWorld.java
package hello;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void init() throws ServletException { }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //设置输入编码格式
response.setContentType("text/html;charset=GB2312"); //设置输出编码格式
PrintWriter out = response.getWriter(); //建议使用PrintWriter输出
out.println("<hr>");
out.println("Hello World! This is created by Servlet!测试中文!");
out.println("<hr>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
request.setCharacterEncoding("GB2312"); //设置输入编码格式
response.setContentType("text/html;charset=GB2312"); //设置输出编码格式
String name = request.getParameter("name");
String id = request.getParameter("id");
if(name==null) name="";
if(id==null) id="";
PrintWriter out = response.getWriter(); //建议使用PrintWriter输出
out.println("<hr>");
out.println("你传入的中文字串是:" + name);
out.println("<hr>你输入的id是:" + id);
out.println("<hr>");
}
public void destroy() { }
}
请用javac -encoding gb2312 HelloWorld.java来编译此程序.
测试此Servlet的程序如下所示:
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<html><head><title></title>
<Script language="JavaScript">
function Submit() {
//通过URL传递中文字符串值给Servlet
document.base.action = "./HelloWorld?name=中文";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input name="id" type="text" value="" size="30">
<a href = "JavaScript:Submit()">传给Servlet</a>
</form></body></html>
4, JAVA程序和数据库之间
为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:
1, 对于JAVA程序的处理方法按我们指定的方法处理.
2, 把数据库默认支持的编码格式改为GBK或GB2312的.
如:在mysql中,我们可以在配置文件my.ini中加入以下语句实现:
在[mysqld]区增加:
default-character-set=gbk
并增加:
[client]
default-character-set=gbk
在SQL Server2K中,我们可以将数据库默认的语言设置为Simplified Chinese来达到目的.
5, 针对JSP代码
由于JSP是在运行时,由WEB容器进行动态编译的,如果我们没有指定JSP源文件的编码格式,则JSP编译器会获得服务器操作系统的file.encoding值来对JSP文件编译的,它在移植时最容易出问题,如在中文win2k中可以很好运行的jsp文件拿到英文linux中就不行,尽管客户端都是一样的,那是因为容器在编译JSP文件时获取的操作系统的编码不同造成的(在中文wink中的file.encoding和在英文Linux中file.encoding是不同的,且英文Linux的file.encoding对中文不支持,所以编译出来的JSP类就会有问题).网络上讨论的大多数是此类问题,多是因为JSP文件移植平台时不能正确显示的问题,对于这类问题,我们了解了JAVA中程序编码转换的原理,解决起来就容易多了.我们建议的解决办法如下:
1,我们要保证JSP向客户端输出时是采用中文编码方式输出的,即无论如何我们首先在我们的JSP源代编中加入以下一行:
<%@page contentType="text/html; charset=gb2312"%>
2,为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:
<%request.setCharacterEncoding("GB2312");%>
3,为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP源文件头上加入下面的一句即可:
<%@page pageEncoding="GB2312"%>或<%@page pageEncoding="GBK"%>
这是JSP规范2.0新增加的指令.
我们建议使用此方法来解JSP文件中的中文问题,下面的代码是一个正确做法的JSP文件的测试程序:
//testchinese.jsp
<%@page pageEncoding="GB2312"%>
<%@page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("GB2312");%>
<%
String action = request.getParameter("ACTION");
String name = "";
String str = "";
if(action!=null & action.equals("SENT"))
{
name = request.getParameter("name");
str = request.getParameter("str");
}
%>
<html>
<head>
<title></title>
<Script language="JavaScript">
function Submit()
{
document.base.action = "?ACTION=SENT&str=传入的中文";
document.base.method = "POST";
document.base.submit();
}
</Script>
</head>
<body bgcolor="#FFFFFF" text="#000000" topmargin="5">
<form name="base" method = "POST" target="_self">
<input type="text" name="name" value="" size="30">
<a href = "JavaScript:Submit()">提交</a>
</form>
<%
if(action!=null & action.equals("SENT"))
{
out.println("<br>你输入的字符为:"+name);
out.println("<br>你通过URL传入的字符为:"+str);
}
%>
</body>
</html>
由于大多数本地测试环境是TOMCAT,现也将其中文问题一并附上.
■Tomcat中文问题
在tomcat5中发现了以前处理tomcat4的方法不能适用于处理直接通过url提交的请求,上网找资料终于发现了最完美的解决办法,每个地方都转换了,而且无论get,和post都正常.
问题描述:
1 表单提交的数据,用request.getParameter("xxx")返回的字符串为乱码或者?
2 直接通过url如http://localhost/test.jsp?name=中国,这样的get请求在服务端用request. getParameter("name")时返回的是乱码;按tomcat4的做法设置Filter也没有用或者用request.setCharacterEncoding("GBK");也不管用
原因:
1 tomcat的j2ee实现对表单提交即post方式提示时处理参数采用缺省的iso-8859-1来处理
2 tomcat对get方式提交的请求对query-string 处理时采用了和post方法不一样的处理方式.(与tomcat4不一样,所以设置setCharacterEncoding("gbk"))不起作用.
解决办法:
首先所有的jsp文件都加上:<%@page pageEncoding="GB2312"%><%@page contentType="text/html; charset=gb2312"%><%request.setCharacterEncoding("GB2312");%>
实现一个Filter.设置处理字符集为GBK.(在tomcat的webapps/servlet-examples目录有一个完整的例子.请参考web.xml和SetCharacterEncodingFilter的配置.)
1)只要把%TOMCAT安装目录%/ webappsservlets-examplesWEB-INFclassesfiltersSetCharacterEncodingFilter.class文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个.
2)在你的web.xml里加入如下几行: <filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3)完成.
2 get方式的解决办法
1) 打开tomcat的server.xml文件,找到区块,加入如下一行:
URIEncoding="GBK"
其实这里才是Tomcat中文乱码的关键所在,完整的应如下:
<Connector
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
URIEncoding="GBK"
/>
2)重启tomcat,一切OK.
执行如下jsp页页测试是否成功
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.*"%>
<%
String q=request.getParameter("q");
q = q == null? "没有值" : q;
%>
<HTML>
<HEAD><TITLE>新闻列表显示</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META http-equiv=pragma content=no-cache>
<body>
你提交了:
<%=q%>
<br>
<form action="tcnchar.jsp" method="post">
输入中文:<input type="text" name="q"><input type="submit" value="确定">
<br>
<a href="tcnchar.jsp?q=中国">通过get方式提交</a>
</form>
</BODY></HTML>
其他编码类似,建议大家使用国际编码规范的UTF8编码.
分享到:
相关推荐
本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...
### jsp乱码解决方案 #### 一、引言 在Web开发中,特别是使用Java Server Pages (JSP)进行开发时,字符编码问题是一个经常遇到的技术难题。如果处理不当,很容易导致网页显示乱码,影响用户体验及数据的正确性。...
"jsp乱码解决超酷,通过web.xml配置"这个标题表明,我们将通过配置`web.xml`文件来解决JSP页面中的乱码问题。下面将详细介绍这个过程以及相关的知识点。 首先,我们需要理解JSP乱码产生的原因。当用户通过表单提交...
《JSP乱码解决方案J2EE》 在Java和JSP开发中,中文乱码问题是一直困扰开发者的老大难问题。这个问题的根源在于Java的内核和class文件基于Unicode编码,而许多其他数据存储媒介如数据库、文件、流则通常使用其他编码...
### JSP乱码解决方案大全 #### 一、概述 在使用Java Server Pages(JSP)进行Web开发时,经常会遇到中文乱码的问题。这不仅影响用户体验,还可能导致数据错误。本文将详细介绍JSP中出现乱码的原因及相应的解决方法...
JSP乱码解决大全 JSP页面显示乱码 表单提交中文时出现乱码 数据库连接
本文将基于提供的JSP乱码解决方案,详细介绍如何通过设置合适的编码来避免或解决乱码问题。 #### 一、概述 JSP(Java Server Pages)是一种基于Java的服务器端动态网页技术标准,广泛应用于构建动态网站。由于涉及...
在给定的描述和标签中,"JSP乱码解决过滤器"指的就是一个专门用于处理乱码问题的Filter。 首先,我们需要了解过滤器(Filter)在Java Web中的作用。过滤器是Servlet规范的一部分,它允许我们在请求到达目标Servlet...
### JSP乱码解决方案 #### 一、引言 在Web开发中,特别是使用Java Server Pages(JSP)进行开发时,经常会遇到字符编码的问题,其中最常见的是乱码问题。本文将详细介绍如何通过设置合适的字符编码来解决JSP中的...
### NetBeans中JSP乱码解决 #### 一、JSP页面显示乱码 在使用NetBeans进行JSP开发时,经常会遇到中文显示乱码的问题。这个问题主要源于服务器与浏览器之间的编码方式不一致所导致。 **示例代码**: ```html ...
**JSP乱码解决方案** 在开发Java Web应用时,JSP页面出现乱码是一个常见的问题,这通常是由于字符编码不一致导致的。解决JSP乱码问题,我们需要关注以下几个关键点: 1. **源文件编码**:确保你的JSP源文件使用...
### JSP乱码问题及其解决方法 #### 一、引言 在进行Java Web开发时,经常遇到的一个问题是页面字符编码出现乱码的情况。虽然这看似是一个小问题,但如果处理不当,会对用户体验甚至整个项目的质量产生严重影响。...
**解决JSP乱码的策略** 1. **设置JSP页面编码**:在JSP文件顶部添加`;charset=UTF-8" language="java" %>`,指定页面编码为UTF-8。 2. **修改服务器配置**:在Tomcat的`server.xml`文件中,找到`Connector`标签,...
本文将深入探讨JSP页面中乱码的常见原因及解决方案。 ### 一、理解字符编码 字符编码是计算机存储和传输文字的方式。不同的编码系统定义了不同的字符集及其对应的二进制表示。常见的字符编码有ASCII、GB2312、UTF-...
乱码解决方法书记累计很多的方法与解决方案一定可以帮到你的哦
以下是一些关于如何解决JSP中中文乱码问题的详细解释和方法: 一、JSP页面显示乱码 JSP页面显示乱码通常是由于页面编码设置不正确或者与浏览器的默认编码不匹配导致的。在JSP页面中,可以通过在页面顶部添加`; ...
jsp编码 jsp乱码解决方案 jsp编码是Java Web开发中的一项重要技术,jsp编码直接影响着Web应用程序的正常运行。jsp编码乱码问题是jsp开发中常见的问题之一,该问题可能会导致jsp页面显示乱码,影响用户体验。因此,...
本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码是计算机对文字进行存储和处理的标准,常见的有ASCII、GBK、UTF-8等。 - JSP页面默认使用ISO-8859-1...
<!--web文件中复制以下代码 --> <filter-name>Filter <filter-class>org.dudenglan.filter.Filter <param-name>encoding <param-value>utf-8 </filter>