亂碼問題

 

11.   乱码解决方案。是否遇到过?有哪些?讲解具体遇到的情形,并说出你在具体的应用中的解决方案。

1.JSP输出中文的乱码问题

所谓在jsp输出中文,即直接在jsp中输出中文,或者给变量赋中文值再输出等,这种情况下的乱码问题往往是因为没有给jsp页面制定显示中文字符的编码方式,解决办法如下:

1)在jsp页面头部加上语句<%@ page contentType="text/html;charset=utf-8"%>(在Servlet中使用httpServletResponse.setContentType("text/html;charset=utf-8"),最好同时在jsp页面的head部分加上<meta http-equiv="Content-Type" content="text/html;charset="utf-8">

2)在每次要输出中文的地方主动转换编码方式,比如要在页面中输入“中文”二字,就可以用以下的方法:

<%

   String str="中文";

   byte[] tmpbyte=str.getBytes("ISO8859_1");

   str=new String(tmpbyte);

   out.println(str);

%>

对于以上这两种方法,显然第一种方法更通用一点,只需要在一个页面中添加一次代码即可;而对于第二种方法,在每个需要输出中文的地方都需要转码,如果这样的地方很多,这将是一个繁重的工作。

2.获取表单提交的数据时的中文乱码问题

在没有加任何其他处理之前,用request.getParameter("paramName")获取表单提交中的数据,且表单数据中含有中文时,返回的字符串会呈现乱码。出现这种问题的原因是Tomcat的j2ee实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理。

解决此问题的办法有两个:

1)不修改其他配置,只是在将表单中的中文数据区出来后再转换编码,方法如语句 String str=request.getParameter("chStr");String str = new String(str.getBytes("ISO-8859-1"),"UTF-8");但这种方法只是从一个局部来考虑问题,如果这样的情况很多,就要写很多次,势必加大工作量。

2)让对所有页面的请求都通过一个Filter,将处理字符集设置为utf-8(根据自己需要也可以设置成其他的,如gb2312,gbk)。具体做法参考Tomcat的webapps/servlet-exemples目录有一个完整的例子,也可以参考其中web.xml和SetCharacterEncodingFilter的配置.

3.URL中的中文问题

对于直接通过在url中传递中文参数,如http://localhost:8080/a.jsp?str="中文"这样的get请求,在服务器端用request.getParameter("name")时返回的往往是乱码。按照以上的做法设置Filter没有用,用request.setCharacterEncoding("utf-8")的方式,仍然不管用。造成这种结果的原因是Tomcat中以get方式提交的请求对query-string处理时采用了和post方法不一样的处理方式。

解决这个问题的方法是是打开Tomcat安装目录下的/conf/server.xml文件,找到Connector块,往其中添加URLEncoding="utf-8"/>

4.数据库访问时的乱码问题

数据库中所有表的编码方式和jsp中的使用的编码要保持一致,这样做的目的可以减少不必要的编码转换问题.另外,在使用jdbc连接MySQL数据库时,连接字符串写成如下形式可以避免一些中文问题:

jdbc://mysql://hostname:port/DBname?user=username&password=pwd&useUnicode=true&character Encoding=utf-8

如果是以数据源的方式连接数据库,配置文件中使用:

<parameter>

   <name>url</name>

   <value>jdbc:mysql://hostname:port/DBname?&useUnicode=true&characterEncoding=utf-8

   </value>

</parameter>

但是如果使用一个已经存在的数据库,数据库的编码方式为ISO-8859-1,而Web应用中使用的utf-8,且数据库已经有很多重要的信息,因此不能通过更改数据库的编码方式来解决。这个时候,在往数据库中写数据时,一定要在jdbc连接字符串中加入“useUnicode=true&characterEncoding=ISO-8859-1”,这样可以顺利的王数据库写入正常的数据。但是,在将数据读出数据库时,乱码又会出现,这个时候就应该在数据取出时对其转码,可以将转码功能写为一个函数,具体实现如下:

public String charConvert(String src){

String result=null;

if(src!=null){

  try{

   result=new String(src.getBytes("ISO-8859-1"),"UTF-8");

  }catch(Exception e){

   result=null;

  }

}

return result;

}

于是,在数据库读出数据过后调用charConvert(rs.getString("colName"));这样就可以正常的显示数据库中的中文数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值