当前位置:编程学习 > JAVA >>

struts2中文乱码,求解决方法

我自己在做一个管理系统,功能差不多完成了,搜索功能用中文搜索后台打印出来的都是问号,但其他功能都能存储读取中文。
filter用的是下面这个
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

其他功能中文都行,但搜索是后台得到是乱码,我已经找到一种解决方法就是把tomcat的配置改成<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>  但这个方法治本不治标,求不用改tomcat的方法 --------------------编程问答-------------------- 把所有编码都改成utf-8 --------------------编程问答-------------------- 在连接数据库的路径上附上编码方式,jsp页面用utf-8,如果使用get方式提交需要修改tomcat里面的server.xml文件 --------------------编程问答-------------------- --------------------编程问答--------------------   如果是struts2的话 在struts。xml中加上 
<!-- 指定WEB应用的编码集,相当于调用HttpServletRequest.setCharacterEncodint方法 如果使用了velocity或freemarker,它也用于指定输出的编码格式 -->
<constant name="struts.i18n.encoding" value="GBK" /> --------------------编程问答--------------------

1.先看一下你的提交方式是不是post提交的,如果是get你的拦截器就会拦截不到。
2.如果是get提交就在struts2配置文件加上<constant name="struts.i18n.encoding" value="GBK" />。
3.如果还是不行就在写一个过滤器。
在web.xml中加入
<!-- 过滤器,用于过滤乱码 -->
<filter>
<filter-name>Filter</filter-name>
<filter-class>
com.aegon_cnooc.framework.filter.Filter
</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在写com.aegon_cnooc.framework.filter.Filter这个类
package com.aegon_cnooc.framework.filter;

import java.io.IOException;


import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 * 
 * @author Administrator
 *
 */
public class Filter implements javax.servlet.Filter{

public void destroy() {
// TODO Auto-generated method stub

}
public void doFilter(ServletRequest request, ServletResponse reponse,
FilterChain chaic) throws IOException, ServletException {
request.setCharacterEncoding("gbk");
reponse.setCharacterEncoding("gbk");
chaic.doFilter(request, reponse);

}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}


--------------------编程问答-------------------- 那就使用过滤器 全部过滤一遍并且转码  --------------------编程问答-------------------- 我的搜索功能用的是url传值,因为servlet默认的是iso-8859-1,所以必须进行转码,其他功能都是用action传值的所以中文没问题,楼市全部方法我都用过的,没有效果,求解决方法 --------------------编程问答--------------------
 function doSearch(){
if(document.all.searchValue.value=="")
{
alert("请输入查询关键字!");
}else{
window.location.href="bookAdmin/list.action?queryName="+document.all.searchName.value+"&&queryValue="+document.all.searchValue.value;
  }
}

<input type="button" value="查询" onClick="doSearch();">

在action里面打印为乱码,除了改tomcat之外还有其他转码方法吗? --------------------编程问答-------------------- 你是get方式传参,对吗?
只要在后台获取这个中文参数之后,立刻对其进行字符集处理即可。

str = new String(str.getBytes("ISO8859_1"), "GBK");
//str是后台获得的中文字符串
--------------------编程问答-------------------- --------------------编程问答-------------------- UTF-8试试看 --------------------编程问答-------------------- 提交的方式有两种,一种是post方法,你可以通过过滤器或配置一个常量来解决,如果是get方法,那需要在tomcat的server.xml中加一个URIEncoding="GBK"来解决,如果你想不动server.xml的配置的话那你要用:str = new String(str.getBytes("ISO8859_1"), "GBK");
这种方法把传输的中文转一下。 --------------------编程问答-------------------- 楼主 我估计是你的js的问题 如果你的js是单独写在js文件中的就把js文件的编码改为和页面编码一致,如果是写在页面里面的要保证页面的编码和你过滤器里面的编码一致,你可以在js里面alert一下你搜索的东西 看看是不是乱码 很可能在这就已经是乱码了。
如果不行的话试试不用spring的编码,用struts的转码在struts的配置文件里面加  
<constant name="struts.i18n.encoding" value="gbk"/> --------------------编程问答--------------------
引用 13 楼 hongkiton 的回复:
楼主 我估计是你的js的问题 如果你的js是单独写在js文件中的就把js文件的编码改为和页面编码一致,如果是写在页面里面的要保证页面的编码和你过滤器里面的编码一致,你可以在js里面alert一下你搜索的东西 看看是不是乱码 很可能在这就已经是乱码了。
如果不行的话试试不用spring的编码,用struts的转码在struts的配置文件里面加  
<constant name="struts.……

在js里alert没乱码,到了action就是乱码了,struts配置文件,我早加了GBK配置了 --------------------编程问答-------------------- 所有的编码都改成UTF-8看看行不行 --------------------编程问答-------------------- 如果是读取出来全部是问号也就说明是从字符到字节在编码的过程中就出现了乱码 --------------------编程问答-------------------- 你数据库里面有没配置好呢,之前一个是由于数据库里面的默认字节配置没配置好,以至于从数据库取出值的时候得到的尽是问号。 --------------------编程问答--------------------
引用 17 楼 river204123 的回复:
你数据库里面有没配置好呢,之前一个是由于数据库里面的默认字节配置没配置好,以至于从数据库取出值的时候得到的尽是问号。

说了是url传值问题啊,我其他功能用中文都可以,不关数据库事 --------------------编程问答-------------------- 引用tag标 --------------------编程问答-------------------- utf-8+post --------------------编程问答-------------------- http://blog.csdn.net/java18/article/details/7170446 --------------------编程问答--------------------  
<constant name="struts.i18n.encoding" value="gbk"/> --------------------编程问答-------------------- --------------------编程问答-------------------- 经过tomcat的时候被编码成iso-8859-1了。。把你action 里面赋值的那个set方法由  
setAbc(String abc){
this.abc=abc;
}
改成 
setAbc(String abc){
this.abc= new String(abc.getBytes("ISO-8859-1"), "gbk");
}

我一般这样做就行  或者 可以在你的js里的参数上加上 encodeURI预编码 --------------------编程问答-------------------- 过滤器只过滤post方法提交的表单!
如果是get方法提交的数据,在servlet中要进行转码,使用encoding
--------------------编程问答-------------------- ZHANGXIAOHAN --------------------编程问答--------------------
引用 9 楼 hanson339751607 的回复:
你是get方式传参,对吗?
只要在后台获取这个中文参数之后,立刻对其进行字符集处理即可。

Java code

str = new String(str.getBytes("ISO8859_1"), "GBK");
//str是后台获得的中文字符串


试试这个不行吗? --------------------编程问答--------------------
引用 8 楼 dctao114 的回复:
JScript code

 function doSearch(){
            if(document.all.searchValue.value=="")
            {    
                alert("请输入查询关键字!");
            }else{
                window.location.h……


试试下面两张方法,在action里面解码:
String filename = request.getParammeter("filename");
filename = new String(filename.getBytes("ISO-8859-1"),"GBK");



String error = request.getParameter("error");
error = java.net.URLDecoder.decode(error, "GBK"); --------------------编程问答-------------------- http://blog.sina.com.cn/s/blog_7d681d490100z0yz.html
写得很详细
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,