request取出的中文为乱码,但是另外的页面是正常的(tomcat)!救急了!up分赃

lifejoy 2003-11-06 09:52:39
在tomcat的使用中,原来运行的系统是正常,现在新近在系统上加入了一个新的页面,原来系统正常,但是新的页面运行错误。设置页面解码,和设置字符集都使用了
但是还是出现中文乱码现象。
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.sql.*" %>

<html>
<head>
<title>
infoaddsave
</title>
</head>
<jsp:useBean id="conn" scope="page" class="netgate.conn" />
<body>
<%
//String sqlsel=new String(),sqlins=new String();
//String mobile= new String(),specode=new String(),msg=new String();
request.setCharacterEncoding("GBK");
String mobile=(String)request.getParameter("mobile");


String specode=(String)request.getParameter("specode");


String msg=(String)request.getParameter("msg");

byte[] bspecode=specode.getBytes("GBK");
specode=new String(bspecode);
byte[] bmobile=mobile.getBytes("GBK");
mobile=new String(bmobile);
byte[] bmsg=msg.getBytes("GBK");
msg=new String(bmsg);



String sqlsel="select SpCode from login where SgCode='"+specode+"'";
out.print(msg);
ResultSet Rs=conn.executeQuery(sqlsel);
if (Rs.next()){
//String SpCode=new String();
String SpCode=Rs.getString("SpCode");
String sqlins="insert into receivewait (SpCode,UserCode,Message,Mobile) VALUES ('"+SpCode+"','"+
specode+"','"+msg+"','"+mobile+"')";
System.out.print(sqlins);
conn.executeInsert(sqlins);
}
conn.destory();
%>
</body>
</html>
...全文
193 点赞 收藏 34
写回复
34 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Rabbit8 2003-11-11
mark
回复
DarkXie 2003-11-10
这个问题很简单,我也碰到过,编码方式一定要正确,
第一步:比如我的TOMCAT装C盘里
,去把
C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\jsp-examples\WEB-INF\classes\filters里的SetCharacterEncodingFilter.class拷贝到你的WEB应用目录下WEB-INF\classes\filters里,注意区分大小写;
第二步:修改你WEB应用里的web.xml文件(不是TOMCAT里的那个)在<web-app>后加入,如下代码
<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>
第三步:重新启动你的TOMCAT,一切OK!
也就这样了,我用的是TOMCAT5。0。2,已经没有问题了,给分吧!
回复
yupingping 2003-11-10
up
up
up
回复
giftxi 2003-11-09
PAGE里写个GBK,再保险点用GETBYTES(“ISO8859_1”)转一下。
回复
zhusuhao 2003-11-09
换个版本的tomcat吧!很有可能是这个原因!
回复
wenger 2003-11-09
tomcat4.0有这个bug
可以加上<%request.setCharacterEncoding("gb2312");%>

只要保证每个页面的编码一致,就不会有乱码
回复
ecaol 2003-11-09
up!
回复
wangkunkevin 2003-11-09
<<JAVA夜未眠>>里介绍说有可能是JDBC或者tomcat本身不支持中文的原因.

自己可以编一个程序,接受到file.enconding,然后再把他System.out.println()
运行后的结果就是你JDK编码的方式!
回复
shdxy 2003-11-09
up
回复
singnet 2003-11-09
应该是Tomcat版本的问题
回复
xwlovesh 2003-11-08
up
回复
xmx0632 2003-11-08
及时雨啊
回复
King6860 2003-11-08
up
回复
lifejoy 2003-11-07
还是不行啊!我现在出差!用猫上网,各位老兄多多帮忙了!
回复
lifejoy 2003-11-07
楼上的!在有的Tomcat上正常,但是在服务器上不正常!也很郁闷的
回复
sunny110 2003-11-07
关注
回复
hlmcn 2003-11-07
战友,
在下曾经收藏过一篇有关中文处理的文章,共享出来,希望对你能有所帮助.


<<关于中文问题的研究>>

很多朋友下载我的BBS-CS社区程序后安装总发现有中文问题,特别是win下Tomcat4以上版本都会出现中文问题(而在Linux下和Tomcat3.x都没有问题),主要问题是页面显示乱码,必须在IE中调整字符集为GB2312才可以正常显示,为解决这个问题,就在每个JSP的页面头上加入<%@ page language="java" contentType="text/html; charset=gb2312" %>这一行,中文是显示了,但是发现从数据库读出的字段变成了乱码,解决的方法是将所有从数据库读出的字段都进行转码,这是一个很大改动,就算我也不愿意去做:(,所以我在win的Tomcat4下研究了一下出现中文乱码的原因:
我首先测试添加数据的情况,发现添加数据后,载数据库中存的中文字是正常的,我查了一下我的数据库连接字串:
mysql.url=jdbc:mysql://localhost:3306/bbscs?user=root&password=&useUnicode=true&characterEncoding=8859_1
其中useUnicode=true&characterEncoding=8859_1很重要,说明数据库是用ISO8859_1的字符集来存取数据的,而java程序在处理的字符的时候默认就是采用统一的ISO8859_1字符集,这也体现了JAVA国际化思想,所以在数据添加的时候JAVA和数据库都是以ISO8859_1方式处理,所以不会出错。
但是在读取数据的时候就出现问题了,数据读出也采用ISO8859_1的字符集,而在JSP的文件头中用了<%@ page language="java" contentType="text/html; charset=gb2312" %>,这说明页面采用GB2312的字符集显示,这就和读出的数据不一样,所以页面显示的从数据库中读出的字符是乱码,所以要对这些字符转码,从ISO8859_1转成GB2312,就可以正常显示了。
在Tomcat3.x、Resin中或是在Linux下,我没有加<%@ page language="java" contentType="text/html; charset=gb2312" %>,而页面中的<meta http-equiv="Content-Type" content="text/html; charset=gb2312">起到了作用,可以正常显示,而加上<%@ page language="java" contentType="text/html; charset=gb2312" %>会报错,说明Tomcat4以上版本的引擎在处理JSP的时候不太一样。
在BBS-CS 3.0中,由于在处理数据库的方面都封装了,所以只要在页面输出的时候做处理就可以了,我会提供一个Win下Tomcat4使用的版本!
数据库的字符集很重要,如果考虑多语言版本,数据库的字符集就应该采用ISO8859_1,只需要在输出的时候采用不同的字符集做转码就可以了,但是这样的做法也有一个问题就是在SQL下不能正常显示字符,各位可根据情况自己处理啦:




如何在Tomcat4.0.1中解决中文输入和显示问题

首先你需要创建一个JAVA文件 名称为MyUtil.java
MyUtil.java的内容如下
import java.io.*;
public class MyUtil{
public static String gb2312ToUnicode(String s){
try{
return new String(s.getBytes("ISO8859_1"),"gb2312");
}
catch(UnsupportedEncodingException uee){
return s;
}
}
public static String unicodeTogb2312(String s){
try{
return new String(s.getBytes("gb2312"),"ISO8895_1");
}
catch(UnsupportedEncodingException uee){
return s;
}
}
}
作完后把此MyUtil.java 或者 MyUtil.class 放在你自己的WEB-INF/classes/下
其次 你要更改几段代码在要显示的JSP文件中
1 在最上面的开头字段该成如下样子
<%@page contentType="text/html; charset=gb2312" language="java" import="java.sql.*,MyUtil,java.util.*"%>
其中 import 近来的MyUtil 和 java.util.* 是解决中文问题关键的所在,切记一定不要忘记补上。
2 找到JSP文件中的 request.getParameter() Method,并且是实际上真正向数据库提取参数起作用的字段,用MyUtil.gb2312ToUnicode()方法 把 request.getParameter()包起来;工作原理是利用import近来的MyUtil.class里的MyUtil.gb2312ToUnicode() 方法实现UTF8字符转换为GB231编码。
具体修改方法如下例:
M=((request.getParameter(M)!=null)?
(String)request.getParameter(M):"" );
更改后变为
M=(MyUtil.gb2312ToUnicode(
(request.getParameter(M)!=null)?
(String)request.getParameter(M):"" ));
便可以完成中文问题的修改工作
回复
liutang2 2003-11-07
用这个就可以了!
String name=new String(request.getParameter("sname").getBytes("8859_1"),"gb2312");
回复
jamesfay 2003-11-07
request.setCharacterEncoding("GB2312");
回复
dengyin2000 2003-11-07
对于
中文处理的常见对策,在网上经常可见的主要是下面2种:
<%@ page
contentType="text/html;charset=gb2312" %>


或者:


<%
String Hi="你好";
byte[]
tmpbyte=Hi.getBytes("ISO8859_1");
Hi=new
String(tmpbyte);
out.print(Hi);
%>

虚拟小龙亭也主要采用了上面2种方法进行了修改,从而变成了1.1版。

通过简单总结,示例中的中文处理发生于以下几个地方:



1 在url附带中文参数,可以直接读取。


例如:
<%= request.getParameter("showword")%>

2
与数据库有关的各种sql操作



这里使用的Access没有发生问题。


3 读取HTML
form表单中递交的中文值



在jswdk中需要加以编码,较为简洁的写法如:
String name1=new
String(request.getParameter("user_id").getBytes("ISO8859_1"));
另外,在jdk1.3的支持下,不需要加入
<%@
page contentType="text/html;charset=gb2312"
%>
而在jdk1.2.2下面,即使2种方法同时运用也很不稳定。

而在resin平台,情况较好。只要在页面第一行加入:
<%@
page contentType="text/html;charset=gb2312"
%>即可正确处理中文。
如果再加编码则反而不对。

5
session中包含的中文



在jswdk中,奇怪的是如果从form中读出的值经过编码则可正确显示;
但直接赋予中文值则不行。
resin平台很好,同上。

6 对于对变量赋中文值后正确显示中文。


 


例如以下程序:
<%@ page contentType="text/html;charset=gb2312"
%>
<html><head></head><body>
<%
String
Hi="你好";
byte[] tmpbyte=Hi.getBytes("ISO8859_1");
Hi=new
String(tmpbyte);
out.print(Hi);
%>
</body></html>
同样是jswdk1.0.1,以上的表示方法在jdk1.2.2中没有问题,但在jdk1.3下却无法显示。
resin平台很好,同上,经过测试,只需要在<head>中补上
<meta
http-equiv="Content-Type" content="text/html;
charset=gb2312">
而不需要<%@ page
contentType="text/html;charset=gb2312" %>也能正确显示中文。



体会:



jswdk也许只能用于普通开发,稳定性和其它问题可能不如商业软件。
由于jdk1.3版性能要好于jdk1.2.2很多倍,并且对中文的支持也较好,所以应该加以采用。

作为免费的商业软件,resin不仅速度快,稳定,自动编译,可指出出错行,可在服务器端支持使用javascript等,而且,至少我觉得对中文的支持很好。




当然,如果不必做任何处理即可正确显示中文将是我们所期待的。



另外,相信在unix/linux/solaris下应该没有这样的问题。

回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2003-11-06 09:52
社区公告
暂无公告