作为一个合格的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 不一样的情况,说起来感觉很费解,编码格式的解析是分大小写的,所以大家在写编码时一定要规范来写。

如何解决JavaWeb乱码问题的更多相关文章

  1. Javaweb 使用Servlet技术改写用户登录 使用Filter技术解决中文乱码

    先把实验3的jsp页面复制过来: WebContent->WEB-INF->lib下面的jar包8.0版本也要记得复制: Java Resources->src下的 cn.edu.h ...

  2. JavaWeb 乱码问题终极解决方案!

    经常有读者在公众号上问 JavaWeb 乱码的问题,昨天又有一个小伙伴问及此事,其实这个问题很简单,但是想要说清楚却并不容易,因为每个人乱码的原因都不一样,给每位小伙伴都把乱码的原因讲一遍也挺费时间的 ...

  3. 增加UBUNTU字符集 解决中文乱码问题

    对GBK,GB2312,GB18030字符集的支持是UBUNTU中文乱码的罪魁祸首,其实我们可以在保持UTF-8为默认编码的条件下添加对这几个编码的支持,以解决中文乱码问题. 我想这个问题肯定有其他人 ...

  4. Sublime Text 2—解决中文乱码

    Sublime Text 2是一个非常棒的代码及文本编辑器,绿色小巧.速度飞快,跨平台支持Win/Mac/Linux,支持32与64位,支持各种流行编程语言的语法高亮.代码补全等,有着许多其他编辑器没 ...

  5. zabbix解决中文乱码问题(没有测试成功)

    zabbix解决中文乱码问题 1.在windows系统中找一个自己喜欢的字体,这里我们用:msyh.ttf 2.将字体上传至/var/www/html/zabbix/fonts目录下 [root@za ...

  6. Spring项目解决Post乱码

    Java EE解决Post乱码:在web.xml中加入: <filter> <filter-name>encodingFilter</filter-name> &l ...

  7. 二招解决php乱码问题

    PHP的乱码问题已经说了N+1遍了,但还是经常看到新手不知道该如何解决php乱码问题,在此本人再重新给总结一下,希望对新手有点帮助 php网页出现乱码一般是在建立数据库时用的编码和php网页的编码不同 ...

  8. 利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码

    利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码 2014-07-31 12:53 1047人阅读 评论(0) 收藏  ...

  9. 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...

随机推荐

  1. Qt保证只有一个实例(将CreateMutex得到的handle通过转换得到值)

    使用CreateMutex 可以实现只启动一个应用程序实例 view plaincopy to clipboardprint?#include <QApplication>#include ...

  2. iPhone 5s网络钓鱼邮件,和苹果发布会同步亮相

    正如预期的一样,网络犯罪分子会利用Apple最新发表的iPhone 5s消息,几乎在苹果的新产品发表会同时,这个网络钓鱼(Phishing)信件开始流传.此次,趋势科技病毒防治中心 Trend Lab ...

  3. nginx access log logrotate配置

    /home/deployuser/deploy/nginx/temp/logs/home.access.log {   size 100M   rotate 100    nocompress   d ...

  4. Junk-Mail Filter(并差集删点)

    Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 度小于所述过程:es.exe

    在防火墙管理,见未知的过程"es.exe" 程序信息: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGVzdGNzX2Ru/font ...

  6. c#学习心得,慢慢添加,如果有错误希望大家留言,我刚开始学

    1.class类:相当于整个项目的一个功能性程序,为了阐述系统中某个对象的功能. 方法:相当于程序的一个功能部件.可以被其他方法或类调用?感觉这个问题有点复杂 c#框架结构:我目前接触到的 using ...

  7. HTML标记语言和CSS样式的简单运用(Nineteenth Day)

    曾经励志下去要坚持把每天所学的知识记录下来,可是坚持了几天后,就觉得自己坚持不下去了....这几天自己好好的想了想,觉得不能坚持也得要坚持,因为要对自己负责,所以得学会逼着自己去做,只有这样才能把一件 ...

  8. 如何在内存中压缩并加密ZIP

    项目中遇到了一个问题,考虑到安全原因,需要将文件以二进制数据的方式打包成压缩文件,并且这个压缩文件是有密码的. 去Google上找了些API,下载来看了下,琢磨出了以下方法 首先放API: <! ...

  9. [C#编程参考]把图像转换为数组的两种实现

    当一个程序和一个图片放在一起,无非有两种操作: 第一种,就是传输这个图片,在传输图片之前要首先把这个图片变成byte类型的数组.所以这时候我们用到的是图片的存储的数据,也就是图片属性中的大小.我们并不 ...

  10. Hadoop 相关问题

    1.MR Job 输入非常多,启动map 非常多,如何提高MapTask 启动速度(附加条件:集群很空闲,资源多多): 参考答案: a.重写调度器算法,降低时间复杂度 b.Out-of-bound h ...