String zh = "你读入的中文";
byte[] bzh = zh.getBytes("ISO-8859-1");
zh = new String(bzh, "GB2312");
===========================================================
Tomcat 乱码问题
在Tomcat 5.0.28的server.xml文件中增加这样一句话URIncoding="GBK",可以防止出现乱码修改地方: <Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIncoding="GBK"/> <-----------
===================================================================================================================从源代码级剖析tomcat乱码问题 [转] -|风过无痕 发表于 2005-10-18 16:08:10
原文见 http://www.jada.blogchina.com/blog/article_164432.1397575.html
tomcat中的乱码基本上有两种 第一类是*.jsp文件中的中文无法正确显示。
第二类是 request 中的 parameter 取出来是乱码
第一类:每个*.jsp文件最终会被编译成一个servlet, 即一个java文件,放到tomcat的work目录下,在访问*.jsp文件时,实际上是运行这个servlet类。 出现乱码的原因是:在将jsp编译成java文件时,采用的默认字符集是iso8859_1, 其中的中文无法正常识别,被编译成iso-8859-1格式,与中文的GBK或GB2312不兼容。 这个工作是由 org.apache.jasper 包完成的。
在每个jsp文件的开头加入 <%@ page contentType="text/html;charset=GBK"%>即可以告诉jasper,在编译时采用GBK格式。
只要去下面的方法中把"ISO-8859-1" 都改为"GBK" 即可完成和上面相同的功能。
void org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(String absFileName, JarFile jarFile, String jspConfigPageEnc) throws JasperException, IOException
第二类:每个request对象实际上都是被封装为一个org.apache.coyote.tomcat5.CoyoteRequestFacade类 在调用 request.getParameter时, tomcat 会进行如下的处理。 1. 将请求传给下面的 CoyoteRequest 实例
String org.apache.coyote.tomcat5.CoyoteRequestFacade.getParameter(String name){
return request.getParameter(name);
} 2. parameter 只有在需要时才被parse, 如果不掉用request.getParameter 或者 request.getParameterValues 之类方法就不会进行parameter 的处理
String org.apache.coyote.tomcat5.CoyoteRequest.getParameter(String name)
if (!requestParametersParsed)
parseRequestParameters();
} 3.设置相应的编码。 调用org.apache.tomcat.util.http.Parameters类进行 parameter parsing
void org.apache.coyote.tomcat5.CoyoteRequest.parseRequestParameters() { requestParametersParsed = true; Parameters parameters = coyoteRequest.getParameters(); && coyoteRequest 是org.apache.coyote.Request 对象的一个实例 String enc = coyoteRequest.getCharacterEncoding(); &&此处取到的值是 request.setCharacterEncoding 中设置的值, 如果没有设置,取出null
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) { && useBodyEncodingForURI 一般是false,所以 parameter的queryStringEncoding 是默认值null
parameters.setQueryStringEncoding(enc);
}
} else { &&&这里说明为什么如果不调用 request.setCharacterEncoding, 会采用默认 sio-8859-1编码
parameters.setEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); &&这里默认值是ISO-8859-1
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding && useBodyEncodingForURI 一般是false,所以 parameter的queryStringEncoding 是默认值null
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
} parameters.handleQueryParameters(); && 此处的 queryParameter 是指类似 "test.jsp?para1=aaa?2=bbb" 中的 "para1=aaa&2=bbb" &&以上是处理 http-get请求的代码,下面是处理http-post请求的代码,和上面的类似。省略。 } 4.对queryString 进行相应处理后继续向下传递
void org.apache.tomcat.util.http.Parameters.handleQueryParameters(){
processParameters(bc.getBytes(), bc.getOffset(), bc.getLength(),queryStringEncoding);
&& queryStringEncoding是null, 见3中的注释
} 5.将decode之后的parameter 和值保存起来
void org.apache.tomcat.util.http.Parameters.processParameters(byte[] bytes, int start, int len, String enc){
addParam(urlDecode(tmpName, enc), urlDecode(tmpValue, enc)); &&enc 一般情况下是null
&&tmpName 是parameter名字 tmpValue是parameter 的值
} 6.此处是关键, parameter的 name 和 prameter的 value在这个方法中被decode.
String org.apache.tomcat.util.http.Parameters.urlDecode(ByteChunk bc, String enc) throws IOException{
String result = null;
$$$$$$$$$$$$$$$$$$$$$$$!!!!!!!! 在这里加一行 enc="GBK", 所有的问题都可以解决了
if (enc != null) { && 此段代码一般不会执行,enc 是null, 见3,4,5中的注释
bc.setEncoding(enc);
result = bc.toString();
} else { &&此处是转换为iso_8859_1, 这是默认值。
CharChunk cc = tmpNameC;
cc.allocate(bc.getLength(), -1);
// Default encoding: fast conversion
byte[] bbuf = bc.getBuffer();
char[] cbuf = cc.getBuffer();
int start = bc.getStart();
for (int i = 0; i < bc.getLength(); i++) {
cbuf[i] = (char) (bbuf[i + start] & 0xff);
}
cc.setChars(cbuf, 0, bc.getLength());
result = cc.toString();
cc.recycle();
}
return result;
} 只需在6中的方法里加一行 enc="GBK", 从request中取出的中文就不会有编码问题了。
而且,即使在jsp页面中写如下代码可以正常运行
<form method="get" action="test.jsp"> <input type="text" name="参数"> </form> <% System.out.println(request.getParameter("参数")); %>
当然,前提是jsp中的中文必须被编译成合法的编码。即按1中所说的方法进行处理 3.如何更改并替换类。 可以从相应的jar包中找到相应的类,反编译后更改,再编译成新的类。 可以去apache 网站下载相应的源代码,更改然后编译成新的类。 有两种方法可以替换旧的类为新改过的类。 一是直接找到相应的jar文件,把新编译的类覆盖进去。可以用winrar打开jar文件,然后直接把新的类拖进去就可以了。 二是在相应的目录下面建对应的目录结构,把对应的类放在下面。因为classloader在loading 新的类时是先去文件目录找类,然后在去jar文件中找,所以目录下面的类优先于jar中的类。
比如,更改了 org.apache.jasper.compiler.ParserController 类之后,可以去 %tomcat-home%\common\lib\jasper-compiler.jar 中把 原有的 ParserController.class直接覆盖。
或者也可以在 %tomcat-home%\common\classes 中建一个 org\apache\jasper\compiler\ 目录,把改好的ParserController.class 放进去。 如果要更改org.apache.tomcat.util.http.Parameters 类,可以覆盖 %tomcat-home%\server\lib\tomcat-util.jar 中的 Parameters.class, 或者建立 %tomcat-home%\server\classes\org\apache\tomcat\util\http 目录,把新的 Parameters.class 放在下面。
byte[] bzh = zh.getBytes("ISO-8859-1");
zh = new String(bzh, "GB2312");
===========================================================
Tomcat 乱码问题
在Tomcat 5.0.28的server.xml文件中增加这样一句话URIncoding="GBK",可以防止出现乱码修改地方: <Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIncoding="GBK"/> <-----------
===================================================================================================================从源代码级剖析tomcat乱码问题 [转] -|风过无痕 发表于 2005-10-18 16:08:10
原文见 http://www.jada.blogchina.com/blog/article_164432.1397575.html
tomcat中的乱码基本上有两种 第一类是*.jsp文件中的中文无法正确显示。
第二类是 request 中的 parameter 取出来是乱码
第一类:每个*.jsp文件最终会被编译成一个servlet, 即一个java文件,放到tomcat的work目录下,在访问*.jsp文件时,实际上是运行这个servlet类。 出现乱码的原因是:在将jsp编译成java文件时,采用的默认字符集是iso8859_1, 其中的中文无法正常识别,被编译成iso-8859-1格式,与中文的GBK或GB2312不兼容。 这个工作是由 org.apache.jasper 包完成的。
在每个jsp文件的开头加入 <%@ page contentType="text/html;charset=GBK"%>即可以告诉jasper,在编译时采用GBK格式。
只要去下面的方法中把"ISO-8859-1" 都改为"GBK" 即可完成和上面相同的功能。
void org.apache.jasper.compiler.ParserController.determineSyntaxAndEncoding(String absFileName, JarFile jarFile, String jspConfigPageEnc) throws JasperException, IOException
第二类:每个request对象实际上都是被封装为一个org.apache.coyote.tomcat5.CoyoteRequestFacade类 在调用 request.getParameter时, tomcat 会进行如下的处理。 1. 将请求传给下面的 CoyoteRequest 实例
String org.apache.coyote.tomcat5.CoyoteRequestFacade.getParameter(String name){
return request.getParameter(name);
} 2. parameter 只有在需要时才被parse, 如果不掉用request.getParameter 或者 request.getParameterValues 之类方法就不会进行parameter 的处理
String org.apache.coyote.tomcat5.CoyoteRequest.getParameter(String name)
if (!requestParametersParsed)
parseRequestParameters();
} 3.设置相应的编码。 调用org.apache.tomcat.util.http.Parameters类进行 parameter parsing
void org.apache.coyote.tomcat5.CoyoteRequest.parseRequestParameters() { requestParametersParsed = true; Parameters parameters = coyoteRequest.getParameters(); && coyoteRequest 是org.apache.coyote.Request 对象的一个实例 String enc = coyoteRequest.getCharacterEncoding(); &&此处取到的值是 request.setCharacterEncoding 中设置的值, 如果没有设置,取出null
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) { && useBodyEncodingForURI 一般是false,所以 parameter的queryStringEncoding 是默认值null
parameters.setQueryStringEncoding(enc);
}
} else { &&&这里说明为什么如果不调用 request.setCharacterEncoding, 会采用默认 sio-8859-1编码
parameters.setEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING); &&这里默认值是ISO-8859-1
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding && useBodyEncodingForURI 一般是false,所以 parameter的queryStringEncoding 是默认值null
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
} parameters.handleQueryParameters(); && 此处的 queryParameter 是指类似 "test.jsp?para1=aaa?2=bbb" 中的 "para1=aaa&2=bbb" &&以上是处理 http-get请求的代码,下面是处理http-post请求的代码,和上面的类似。省略。 } 4.对queryString 进行相应处理后继续向下传递
void org.apache.tomcat.util.http.Parameters.handleQueryParameters(){
processParameters(bc.getBytes(), bc.getOffset(), bc.getLength(),queryStringEncoding);
&& queryStringEncoding是null, 见3中的注释
} 5.将decode之后的parameter 和值保存起来
void org.apache.tomcat.util.http.Parameters.processParameters(byte[] bytes, int start, int len, String enc){
addParam(urlDecode(tmpName, enc), urlDecode(tmpValue, enc)); &&enc 一般情况下是null
&&tmpName 是parameter名字 tmpValue是parameter 的值
} 6.此处是关键, parameter的 name 和 prameter的 value在这个方法中被decode.
String org.apache.tomcat.util.http.Parameters.urlDecode(ByteChunk bc, String enc) throws IOException{
String result = null;
$$$$$$$$$$$$$$$$$$$$$$$!!!!!!!! 在这里加一行 enc="GBK", 所有的问题都可以解决了
if (enc != null) { && 此段代码一般不会执行,enc 是null, 见3,4,5中的注释
bc.setEncoding(enc);
result = bc.toString();
} else { &&此处是转换为iso_8859_1, 这是默认值。
CharChunk cc = tmpNameC;
cc.allocate(bc.getLength(), -1);
// Default encoding: fast conversion
byte[] bbuf = bc.getBuffer();
char[] cbuf = cc.getBuffer();
int start = bc.getStart();
for (int i = 0; i < bc.getLength(); i++) {
cbuf[i] = (char) (bbuf[i + start] & 0xff);
}
cc.setChars(cbuf, 0, bc.getLength());
result = cc.toString();
cc.recycle();
}
return result;
} 只需在6中的方法里加一行 enc="GBK", 从request中取出的中文就不会有编码问题了。
而且,即使在jsp页面中写如下代码可以正常运行
<form method="get" action="test.jsp"> <input type="text" name="参数"> </form> <% System.out.println(request.getParameter("参数")); %>
当然,前提是jsp中的中文必须被编译成合法的编码。即按1中所说的方法进行处理 3.如何更改并替换类。 可以从相应的jar包中找到相应的类,反编译后更改,再编译成新的类。 可以去apache 网站下载相应的源代码,更改然后编译成新的类。 有两种方法可以替换旧的类为新改过的类。 一是直接找到相应的jar文件,把新编译的类覆盖进去。可以用winrar打开jar文件,然后直接把新的类拖进去就可以了。 二是在相应的目录下面建对应的目录结构,把对应的类放在下面。因为classloader在loading 新的类时是先去文件目录找类,然后在去jar文件中找,所以目录下面的类优先于jar中的类。
比如,更改了 org.apache.jasper.compiler.ParserController 类之后,可以去 %tomcat-home%\common\lib\jasper-compiler.jar 中把 原有的 ParserController.class直接覆盖。
或者也可以在 %tomcat-home%\common\classes 中建一个 org\apache\jasper\compiler\ 目录,把改好的ParserController.class 放进去。 如果要更改org.apache.tomcat.util.http.Parameters 类,可以覆盖 %tomcat-home%\server\lib\tomcat-util.jar 中的 Parameters.class, 或者建立 %tomcat-home%\server\classes\org\apache\tomcat\util\http 目录,把新的 Parameters.class 放在下面。
1.页面到action后,数据是否正常
2.插到数据后,数据是否正常
3,从数据库读到action后,数据是否正常
4.在页面显示是否正常
去网上找一个代码
然后在web.xml中配置一下
1。我同意上面这个观点,
具体转换方法:
String str = "你需要插入库的值";
byte[] datastr = str.getBytes("数据库的字符编码","你页面的字符编码"); 例如:
byte[] datastr = str.getBytes("GBK","ISO-8859-1");
2。我自己的观点,
你用的什么数据库?你用数据库自带的命令去调出库中的数据是不是乱码,有一种可能是你用了
第三方客户端软件去查看数据库中的数据,如用Toads去操作、查看Oracle库中的数据,如果在配置第三方软件时,字符编码与数据库的不符,那么你在第三方软件中看到的将是乱码,其实
数据库中的值并不是乱码。建议就这些了,你自己去找找看到底是什么问题。
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import java.io.IOException;
import javax.servlet.http.*;public class EncodingFilter implements Filter {
private String encoding;
public EncodingFilter() {
}
public void init(FilterConfig fconfig) throws ServletException {
encoding=fconfig.getInitParameter("charset");
}
public void doFilter(ServletRequest req, ServletResponse resp,FilterChain fchain) throws IOException,
ServletException
{
HttpServletRequest request=(HttpServletRequest)req;
request.setCharacterEncoding(encoding);
fchain.doFilter(req,resp);
}
public void destroy() {
}
}
//web.xml
<filter>
<filter-name>encoding</filter-name>
<filter-class>com.sp.util.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
解决web开发中的中文问题。
http://www.blogjava.net/rickhunter/articles/33571.html