以Tomcat 3.2.1的JSP应用为例,一般遇到中文问题可以使用如下的编码强制转换函数进行内码的转换。
public static String toChinese(String strvalue)
{
try{
if(strvalue==null)
return null;
else
{
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
注意,在使用该函数前,我们需要分析中文无法正确输出的原因到底是什么,而不能将所有的中文处理的问题都用这个方法来解决。例如,如果是由于忘记将JSP的输出代码定义为GB2312或GBK而产生的中文无法正确输出就不能用这个函数来解决。一个好的习惯是在我们编写每一个JSP页面时都在文件的第一行定义程序所要输出的字符集,如
<%@ page contentType="text/html; charset=GBK" %>或
<%@ page contentType="text/html; charset=GB2312" %>
对于一些不支持定义输出的字符集的JSP版本,我们也可以作如下的设置:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
另外还需要注意的是,这个函数是用来解决那些确实出现了无法正确输出中文的代码,而不是一个通用的用来保证中文字符正确输出的函数。由于中文字符无法正确的输出或读入的原因都是因为这个字符的编码和系统缺省的字符集编码(或者是应用所要输出的字符集,二者一般情况下是相同的)的不同引起的,所以在应用该函数前我们必须确定我们所要读入或输出的字符的编码到底与系统缺省的字符集编码是否相同。
public static String toChinese(String strvalue)
{
try{
if(strvalue==null)
return null;
else
{
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");
return strvalue;
}
}catch(Exception e){
return null;
}
}
注意,在使用该函数前,我们需要分析中文无法正确输出的原因到底是什么,而不能将所有的中文处理的问题都用这个方法来解决。例如,如果是由于忘记将JSP的输出代码定义为GB2312或GBK而产生的中文无法正确输出就不能用这个函数来解决。一个好的习惯是在我们编写每一个JSP页面时都在文件的第一行定义程序所要输出的字符集,如
<%@ page contentType="text/html; charset=GBK" %>或
<%@ page contentType="text/html; charset=GB2312" %>
对于一些不支持定义输出的字符集的JSP版本,我们也可以作如下的设置:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
另外还需要注意的是,这个函数是用来解决那些确实出现了无法正确输出中文的代码,而不是一个通用的用来保证中文字符正确输出的函数。由于中文字符无法正确的输出或读入的原因都是因为这个字符的编码和系统缺省的字符集编码(或者是应用所要输出的字符集,二者一般情况下是相同的)的不同引起的,所以在应用该函数前我们必须确定我们所要读入或输出的字符的编码到底与系统缺省的字符集编码是否相同。
或者在servlet里面要写一句怎么样的代码就可以让Attribute里面的东西保持中文编码。
HttpServletResponse response)
throws
ServletException, IOException
{
request.setCharacterEncoding("GB2312");
response.setContentType(CONTENT_TYPE); String action = request.getParameter("search");
if (action != null)
{
//导向查询页面
doSearch(request, response);
return true;
}
action = request.getParameter("view");
if (action != null)
{
//导向浏览页面
doView(request, response);
return true;
}
action = request.getParameter("AddNav");
if (action != null)
{
//导向添加页面
doDisplayAdd(request, response);
return true;
}
action = request.getParameter("EditNav");
if (action != null)
{
//导向更新页面
doDisplayModify(request, response);
return true;
}
return false;
}在你调post或者get方法时调用这个方法,
就不会出现乱码问题了.
如:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
if (doPerformGet(request, response))
{
return;
}
if (doPerformPost(request, response))
{
return;
}
doSearch(request, response);
}
如果request.setCharacterEncoding("GB2312");,页面显示是正常了,但是插入到MySQL数据库的数据不对,只要是中文,全都变成一个大写字母K。
如果不用request.setCharacterEncoding("GB2312");,插入到数据库的东西是对的,但是页面上显示是问号。
楼上的兄弟们都跟你出了很多招了。你参考着用,一定可以。
首先写一个ISO->GB2312的转换函数
package myclass;
public class ISOtoGB2312{
public static String convert(String str){
try {
byte[] byteStr = str.getBytes("ISO-8859-1");
return new String(byteStr, "gb2312");
}
catch(Exception e) {
return str;
}
}}
其次不要request.setCharacterEncoding("GB2312");
然后分两种情况
1.linux下
在得到传参时不要做转换
String str = request.getParameter("Name");
直接将其插入mysql
String cmd = "Insert into myusers set name = '"+str+"'";
stmt.executeUpdate(cmd);
需要显示时,做转换
<%=ISOtoGB2312.convert(str)%>
将数据从数据库读出时,做转换后显示
<%=ISOtoGB2312.convert(rs.getString("name"))%>
另,mysql编译源码时应使其支持中文./configure --with--charset=gb2312
2.win2k下
得到传参时要做转换
str = ISOtoGB2312.convert(request.getParameter("Name"));
再将其插入mysql
String cmd = "Insert into myusers set name = '"+str+"'";
显示时无须再转换
<%=str%>
将数据从数据库读出可直接显示
<%=rs.getString("name")%>
另,应在my.ini中加default-character-set=gbk使其支持中文
首先不用request.setCharacterEncoding("GB2312");,也不用ISO何GB2312的转换。然后在servlet里面写上一句话:
PrintWriter out = response.getWriter();
就算后面不再去使用这个out,用RequestDispatcher forward到一个JSP页面后中文就能够正常现实!然而如果把这句话去掉,就显示问号!!我前面提问题的时候是在tomcat上作东西,现在回家了是在WSAD上面做的,结果发现了上述不可思议的事情,各位帮帮忙试验一下,把结果写出来贴出来,大家讨论一下在servlet里到底应该怎么样处理中文。
一个html页面提交表单到一个servlet,servlet处理以后将一个中文字符串(就是request.getParameter()得到的)set成一个Attribute,然后用RequestDispatcher将请求转到一个JSP,JSO用getAttribute()读取Attribute再toString(),显示出来不对。
大家可能觉得这样没必要,因为在JSP里面也可以getParameter(),但是我的Parameter并不是原封不动的,要加入一点东西,而又不能setParameter,所以只能setAttribute了。