如何解决JavaWeb乱码问题

 

作为一个合格的web开发人员应该是什么问题都遇到过的,尤其是乱码问题。大家也许都体会到了,我们中国人学编程,很大的一个不便就是程序的编码问题,无论学习什么技术,我们都需要探讨他的编码问题。

今天来讲一下关于解决javaweb乱码出现的原因与解决办法,欢迎大家交流指正。

首先,先明确两个问题,为什么会出现乱码?我们在编写web应用时什么时候会出现乱码?

第一个问题:很多初学者会发现,我们在自己的客户机上编写的web应用程序时,明明是正常的汉字,但是发布到服务器上访问的时候浏览器就会看到乱码。

出现这种问题的原因是:通常中文windows系统中系统默认的编码是GBK(大家可以进入DOS窗口下,输入chcp进行查询),而我们编写web应用时,myeclipse默认的编码通常是iso8859-1,浏览器也会有自己的编码选择。。。这么多地方使用的不同编码,如果两个编码不对口,当然就会出现乱码。

第二个问题:出现乱码的地方可以归结为三类:1.基本jsp页面显示乱码,2.表单提交乱码,3.数据库乱码

下面为大家依次讲解:

1.基本jsp页面显示乱码

这种情况比较简一般只有初学者会出现,原因是因为jsp页面保存,转换时的编码与浏览器解析的编码不一样。这里涉及到三个解决方案

1).<%@ page language="java" pageEncoding="UTF-8"%>  我们都知道,jsp就是servlet,jsp会转换成servlet之后转换为相关的java代码再发给客户端。

那么jsp中就需要有语句可以控制jsp是以什么编码转换为servlet的。上述编码就是控制,jsp以UTF-8的编码方式保存,也就是说以UTF-8的编码方式转换成servlet。

2).<%@ page contentType="text/html;charset=UTF-8"%> 熟悉HTTP协议的朋友都不陌生这一句代码,charset="UTF-8",就是设置响应头编码方式为UTF-8。

3).<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 同上一句代码,只不过这一句使用HTML控制浏览器解析方式。

示例:

我们在一个简单的jsp页面中写下这样的代码,页面中有汉字,却默认pageEncoding="iso8859-1"

<%@ page language="java" import="java.util.*" pageEncoding="iso8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<form action="encoding.jsp" method="get">
username:<input type="text" name="name" /><br>
性别:<input type="text" name="sex" /><br>
<input type="submit" value="submit" />
</form>
</body>
</html>

页面显示:

HTTP报文请求头:

大家只要按照上述修改响应时的默认编码即可。

2.表单提交乱码

我们在使用表单提交中文时也会出现乱码,原因就是Tomcat服务器内部编码默认是iso8859-1,Tomcat会以编码的缺省方式利用iso8859-1来解析中文。

表单get方式提交时,服务器会用默认的编码对提交的数据进行解析,并添加到url后面传到下一个页面。

解决方法:在Tomcat 服务器的server.xml文件中进行配置,在Connector节点中加入useBodyEncodingForURI="true"  URIEncoding=”UTF-8”,这样接收页面就会利用UTF-8进行解码了。

表单post方式提交时,提交的数据不再加入到url中,我们可以在web应用中添加一个servlet过滤器来设置编码统一(servlet过滤器会在访问设置的相关url之前执行)。

过滤器相关代码:

public class ConvertEncoding implements Filter {

    private String encoding;
@Override
public void destroy() {
} @Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding(encoding);//设置请求编码
resp.setContentType("text/html;charset="+encoding);//设置响应编码
chain.doFilter(req,resp);
} @Override
public void init(FilterConfig config) throws ServletException {
this.encoding = config.getInitParameter("encoding");//读取默认编码
} }

相关配置web.xml:

<filter>
<filter-name>Encoding</filter-name>
<filter-class>Filters.ConvertEncoding</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这样我们会发现即使是post方式提交的数据,也不会出现乱码情况。、

3.数据库乱码

对于大多数数据库的JDBC驱动程序,在Java程序和数据库之间传递数据都是以ISO8859-1为默认编码格式,所以,在程序中向数据库存储包含中 文的数据时,驱动程序受限把程序内部Unicode编码格式的数据转换为ISO8859-1编码,然后传递到数据库中,如果要解决数据库乱码问题,最简单的就是更改数据库默认编码格式。

后记:

关于UTF-8编码:UTF-8编码在写的时候要规范一律写为大写(在mysql数据库中需要使用别名utf8)。编码的书写格式在windows下一律是部分大小写的,但是有的ide是严格区分大小写的,有些朋友可能遇见过ide告诉你 utf-8和UTF-8 不一样的情况,说起来感觉很费解,编码格式的解析是分大小写的,所以大家在写编码时一定要规范来写。

如何避免JSP乱码的更多相关文章

  1. 关于JSP乱码问题

    关于jsp乱码问题的解决. 1 最基本的乱码问题. 这个乱码问题是最简单的乱码问题.一般新会出现.就是页面编码不一致导致的乱码. <%@ page language="java&quo ...

  2. 编码之JSP乱码涉及问题

    各种编码一栏表 A. JSP/Servlet都有的编码设置 1. request.setCharacterEncoding("UTF-8") 2. response.setChar ...

  3. 关于jsp乱码问题的产生原因 及 解决方法。

    http://blog.csdn.net/caoxiaohong/article/details/1781777 JSP/JDBC MySQL乱码问题JSP的request 默认为ISO8859_1, ...

  4. 中文乱码总结之JSP乱码

    一.JSP中文乱码问题 JSP页面的汉字显示为乱码,而英文和阿拉伯数字正常. 二.原因 汉字编码时用的字符集 与解码用的字符集不一致:所有的字符集都兼容ASCII码,所以英文.数字不存在乱码. 编号 ...

  5. jsp乱码的问题

    大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着大家,现把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考.首先了解一下Java中文问题的由来: Java的内核和class文 ...

  6. JSP乱码问题

    在JSP中通过request对象获取请求参数时,如果遇到参数值为中文的情况,若不进行处理,获取到的参数值将是乱码.乱码情况分为以下两种: 1. 获取访问请求参数时乱码,采用如下方式解决. String ...

  7. eclipse+maven的web项目访问jsp乱码

    在jsp中第一行加一句这个就不会乱码了 <%@ page language="java" import="java.util.*" pageEncodin ...

  8. index.jsp乱码问题的解决

    我们在做java项目的时候,都会有个首页,一般就是index.jsp,然后在index.jsp中引入相关的文件,一般也是引入打包过后的相关资源文件. 当index.jsp上面的中文出现乱码的时候,就需 ...

  9. 怎样解决Myeclipse中运行jsp乱码问题,亲测有效(虽然是个小问题但是为了大家不被网络上的一些乱七八糟的回答坑)不是改什么windows-propories-...............

    方法: 在jsp页面中pageEncoding属性值改为UTF-8,指定用UTF-8编码.gbk或者gb18030编码都无效.不是改什么windows-propories-.............. ...

随机推荐

  1. QDialog弹出一个窗口,改变窗口大小

    创建一个QT应用 文件->新建文件或项目 Application->Qt Widgets Application 其他下一步 基类选择QDialog 其他下一步 resize() 改变窗口 ...

  2. iOS定位功能

    1.实现定位功能需要导入系统库MapKit.framework 2.在iPhone手机上默认是禁止手机定位的,所以,要询问系统是否开启手机定位功能. 为了开启手机定位功能,还需在info.plist中 ...

  3. QT 信号与槽 QT简单加法器的实现

    信号与槽 背景: 面向过程 模块之间低耦合设计(高内聚). 函数调用: 直接调用 回调调用(低耦合) 面向对象 模块之间低耦合设计(高内聚) 对象调用 直接调用 接口调用 QT: 信号与槽解决问题: ...

  4. SQL Server索引进阶:第十二级,创建,修改,删除

    在第十级中我们看到了索引的内部结构,在第十一级中我们看到了平衡树结构潜在的负面影响:索引碎片.有了索引内部结构的知识,我们可以检查在执行数据定义语句和数据操作语句的时候,都发生了什么.在本级中我们介绍 ...

  5. SQLSERVER 列名无效

    很多时候对数据库表修改字段后会出现“列名无效”,或者在查询分析器里面是红色的下划线,造成这个现象的原因是:SQL Server的intellisense(智能感知功能),没有感知到更改,需要重新整理一 ...

  6. iOS网络请求之---GET和POST

    get是从服务器上获取数据,post是向服务器传送数据.前者把参数数据加在了将参数直接写在访问路径上.操作简单,不过容易被外界看到,安全性不高,地址最多255字节,后者则是将参数放到body里面.PO ...

  7. 块对象block小结(2)

    MRC环境下 ////  main.m//  blcok////  Created by ios on 16/4/6.//  Copyright © 2016年 ios. All rights res ...

  8. 怎样在UICollectionView中添加Header和footer

    ---恢复内容开始--- 怎样在UICollectionView中添加Header和footer 转载于http://my.oschina.net/zboy/blog/221525 摘要 来自-htt ...

  9. h5的api dom全屏展示

    下面是完整的例子,暂不做分析 <!DOCTYPE html> <html> <head> <title> FullScreen API 演示</t ...

  10. 一周学会Mootools 1.4中文教程:(6)动画

    先看一下动画的参数设置: 参数: fps - (number:默认是50) 每秒的帧数. unit - (string:默认是 false) 单位,可为 'px','em',或 '%'. link - ...