JAVA EE、PHP项目中乱码的解决

1、JAVA EE项目中的乱码

在java ee项目中,乱码产生的因素有以下方面:

(1)数据库编码

(2)服务器引擎编码

(3)java系统编码

乱码产生的原因一般是三者的编码形式不统一,大部分使用者喜欢使用gbk或者gbk2312进行程序编码,为了国际化的统一,建议全部使用utf-8进行编码,这样便于统一。

下面总结一下项目中编码的经验:

页面编码:

(1)对于普通的前端页面(html页面),在页面的头标签中加入:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

同时页面保存时的编码也选择utf-8。

(2)对于jsp页面:

在页面的头标签中加入:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

同时在页面首行加入:

<%@ page contentType="text/html;charset=utf-8" %>

JAVA系统编码: 

JAVA系统编码,可以通过String类型的构造进行,但是对于一般的页面参数编码,是否需要在JAVA系统中进行重新编码,取决于使用的web服务引擎,对于Jetty、Sap Was,不需要重新编码,服务器自动转码,但是对于tomcat等其他web服务器引擎,需要在JAVA系统中进行重新编码。

 

数据库编码:

在JAVA EE项目中,web服务引擎可以很好的处理数据库与服务器之间的字符编码,所以一般数据库采用默认的安装编码。

2、PHP项目中的乱码

数据库编码:

初学PHP,在实践中碰到了数据库取值乱码问题,查了很多资料,最终的解决方法是:

(1)将数据库中的数据表编码设置为utf-8编码格式的(其实这一步设置没什么关系,可以不设置)

(2)在连接mysql数据库时,指定字符集:

mysql_query("set names 'utf8'",$connection);

这样解决的其实是由于php和数据库的编码规则不一致,产生的乱码。

页面编码:

页面编码有点像JSP,也需要设置两点:

(1)在页面的头标签中加入:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

(2)在php脚本的首行加入:

header("content-type:text/html; charset=utf-8");

 

3、JAVA EE项目中,具体的乱码处理

<1>浏览器地址栏传递乱码

例如:
<a href="login.do?typeid=表格维护">表格维护 </a>

tomcat做web服务器时,通过地址栏传中文参数时,为防止浏览器上的为乱码
需在服务器server.xml中配置对应的端口中配置编码方式即可.例如: 
<Connector port="8080"
              maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
              enableLookups="false" redirectPort="8443" acceptCount="100"
              debug="0" connectionTimeout="20000"
              disableUploadTimeout="true"  useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

 

最佳的处理方式是在url地址中,参数不要使用中文传值,可以通过字典表用mapping方式解决。

<2>JSP页面显示乱码
下面的显示页面(display.jsp)就出现乱码:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>
对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器

对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一

行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。完整页面如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<%
out.print("JSP的中文处理");
%>
</body>
</html>

 
 <3>表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
下面是处理页面(process.jsp)代码:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF

-8编码方式来发送请求,而UTF- 8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。

解决办法:通过request.seCharacterEncoding ("gb2312")对请求进行统一编码,就实现了中文的正常

显示。修改后的process.jsp代码如下:
<%@ page contentType="text/html; charset=gb2312"%>
<%
request.seCharacterEncoding("gb2312");
%>
<html>
<head>
<title>JSP的中文处理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body>
<%=request.getParameter("name")%>
</body>
</html>

<4>数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上
useUnicode=true&characterEncoding=GBK 就OK了。

 

<5>数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就

可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:
public class Convert {
/** 把ISO-8859-1码转换成GB2312
*/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("编码转换错误:"+e.getMessage());
return "";
}
}
}
把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值