求救!!关于GBK和UTF8的棘手问题,在线等,解决后马上结贴!!

element_wm 2007-08-06 04:44:50
问题是这样的。本来我们系统中定好的是使用GBK的编码方式,可是我做的一个页面中要解析传回来的XML所以我使用了UTF-8的编码方式。
因为系统中的覆盖了ActionServlet 的 service 方法,提交上去的都为GBK,这样我这个页面提交到Action的中文就都成了乱码,无论使用uri传值还是通过form提交都是这样
public void service(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException {
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");

能不能,单独让我的这个Action接收的是UTF-8的啊
着急啊,今天一定要解决的,请各位老大帮帮吧,解决马上给分结贴
...全文
292 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yijie1206688 2007-08-08
  • 打赏
  • 举报
回复
我不是说了吗,把filter放在最上面

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.haiersoft.wdlb.bo.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/wdlb.do</url-pattern>
</filter-mapping>


<servlet>
<servlet-name>action</servlet-name>
<servlet-class>com.haiersoft.core.servlet.DefaultActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>sysinfo</param-name>
<param-value>/WEB-INF/conf/sysinfo.xml</param-value>
</init-param>
<init-param>
<param-name>log4j</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>cachePath</param-name>
<param-value>\WEB-INF\conf\cache.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>

<taglib>
<taglib-uri>tiles</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>logic</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>html</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>page</taglib-uri>
<taglib-location>/WEB-INF/page.tld</taglib-location>
</taglib>


</web-app>



把<url-pattern>/wdlb.do</url-pattern>
改成
<url-pattern>/*</url-pattern>
element_wm 2007-08-08
  • 打赏
  • 举报
回复
请问yijie1206688() 现在已经可以走到你的那个方法了,但是默认的方法还是执行,而且是在他之后执行,应该如何解决,现在我把我的web。xml贴出来,请你帮我看一下吧,这个问题实在绕不过去了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>com.haiersoft.core.servlet.DefaultActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>sysinfo</param-name>
<param-value>/WEB-INF/conf/sysinfo.xml</param-value>
</init-param>
<init-param>
<param-name>log4j</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>cachePath</param-name>
<param-value>\WEB-INF\conf\cache.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>

<taglib>
<taglib-uri>tiles</taglib-uri>
<taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>logic</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>html</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>page</taglib-uri>
<taglib-location>/WEB-INF/page.tld</taglib-location>
</taglib>

<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.haiersoft.wdlb.bo.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/wdlb.do</url-pattern>
</filter-mapping>
</web-app>

element_wm 2007-08-08
  • 打赏
  • 举报
回复
请问楼上怎么单独处理法,我现在就是不知道怎么处理
ever_li 2007-08-07
  • 打赏
  • 举报
回复
在处理xml之前先用GB2312取得byte数组,然后再用UTF-8利用byte数组构造String应该就可以了。
KingNE 2007-08-07
  • 打赏
  • 举报
回复
单独处理你得代码就行!
bing3joe 2007-08-07
  • 打赏
  • 举报
回复
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.battwofame.hellojava.telservlet.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
=====================================================
<url-pattern>/*</url-pattern>------不要/* , 单独写你要过滤得那个路径,那就不会影响其他的编码传递了
yijie1206688 2007-08-06
  • 打赏
  • 举报
回复
加这个类:
package org.battwofame.hellojava.telservlet.filter;
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 CharacterEncodingFilter implements Filter {

public void destroy() {
}

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

public void init(FilterConfig arg0) throws ServletException {
}
}


在web.xml的最上面加:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.battwofame.hellojava.telservlet.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


你只要直接把这考过去,换个包名就可以用
element_wm 2007-08-06
  • 打赏
  • 举报
回复
你这样是不是所有提交的都过滤成utf8的了?可是我们系统的其他页面已经都规定好了GBK的,只有我的这个页面比较特殊。这样写的话,其他的页面不就出错了?
bunrise 2007-08-06
  • 打赏
  • 举报
回复
struts-config.xml里面写上<controller processorClass="mylib.myProcessor" />

这样只要是提交的数据都可以过滤.
element_wm 2007-08-06
  • 打赏
  • 举报
回复
ls的意思是让我自己写一个Processor?这样我的Action可以专门用这个类?
bunrise 2007-08-06
  • 打赏
  • 举报
回复
import org.apache.struts.action.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

public class myProcessor extends RequestProcessor {
public boolean processPreprocess(HttpServletRequest request,
HttpServletResponse response) {
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return true;
}
}
element_wm 2007-08-06
  • 打赏
  • 举报
回复
忘记说了,我这里面有繁体字的
element_wm 2007-08-06
  • 打赏
  • 举报
回复
这个好像是应该String str =new String(str.getBytes(),"UTF-8");吧。我也是过了还是有问号存在
javaGirlOrBoy 2007-08-06
  • 打赏
  • 举报
回复
String str =new String(str.getBytes(),"GBK");
element_wm 2007-08-06
  • 打赏
  • 举报
回复
现在我已经尝试过了,在我的页面上
request.setCharacterEncoding ("UTF-8");
在Action上也request.setCharacterEncoding ("UTF-8");
还是不好用
在JavaScript里form提交的时候使用.action=encodeURI(url); 也不行

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧