乱码产生的原因

  不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的。以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器之间的通信实质上是socket流,所以要先将请求参数(字符)转换成字节,也就是编码过程,服务器接收到请求参数后进行解码(字节转字符),然后封装到request对象中。如果客户端的编码与服务器端的解码不统一,就会导致通过request获取到的请求参数的值是乱码。

乱码出现在这么几个位置上

  • 数据传递过程中的乱码
  • 数据保存过程中的乱码
  • 数据展示过程中的乱码

一、数据传递过程中的乱码

  从浏览器发起的访问方式有三种:在地址栏直接输入URL访问、点击页面中的超链接访问、提交表单访问。

  第一种访问方式浏览器默认将参数按照utf-8进行编码,后面两种访问方式浏览器是将参数按照当前页面的显示编码进行编码。

  所以对于request乱码,只需要在服务器端设置相应的解码格式即可。由于访问方式不同,浏览器对参数的编码格式也不同,为了方便处理,通过超链接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码。

  1、 POST方式属于表单提交,参数存在于请求体中。     

    request.setCharacterEncoding("utf-8")

    这行代码必须出现在从request对象中获取数据request.getParameter(String name)之前设置才起作用。

    这个方法只处理请求体中的乱码问题,对请求行中的乱码不起作用。(处理POST请求中的乱码问题)

  2、 GET方式提交的参数会跟在请求行中的uri后边。

    服务器按照默认的ISO-8859-1进行解码,这时候会出现获取参数会出现乱码,可以修改服务器端对uri参数的默认编码

    关于GET请求中的乱码问题,主要是告诉Tomcat服务器请求行中采用什么样字符编码方式,我们可以去修改Tomcat服务器中的server.xml文件,

    将server.xml文件中配置端口号的标签末尾添加URIEncoding="UTF-8",(默认没有设置此属性),这样就可以解决GET请求中的中文乱码问题。

    原版的server.xml配置:

<Connector port="8080" protocol="HTTP/1.1"
     connectionTimeout="20000"
     redirectPort="8443" />

    修改后的server.xml配置:

<Connector port="8080" protocol="HTTP/1.1"
     connectionTimeout="20000"
     redirectPort="8443"
             useBodyEncodingForURI="true"
             URIEncoding="UTF-8"/>

    注意:设置元素的属性useBodyEncodingForURI="true",意思是请求体和uri使用相同的编码格式。useBodyEncodingForURI默认是false,通过设置这两个属性,既可以解决get方式的乱码,又可以解决post方式的乱码。

  3、还有一种万能方式处理乱码:

  假如参数传送的时候编码方式是ISO-8859-1,我们可以将从request中获取的数据采用ISO-8859-1的方式进行解码,让这个数据再次回到正常的byte[]数组状态,然后再采用一种支持中文的编码方式进行编码,这种方式是一种万能的方式,适合所有的情况。但是前提是必须知道原先采用的原始编码方式是什么,才能够让我们的数据再回到原始状态(byte[]数组),这种方式的缺点就是太麻烦,如果表单中提交的数据量比较大,编码量也就随着庞大起来。

String parameter = new String(request.getParameter("remarkInfo").getBytes("iso-8859-1"),"utf-8");

二、数据保存中出现的乱码问题

  数据保存指的是数据库中的乱码问题,有的时候我们在数据库表中存储的中文无法正常显示,显示为乱码,为什么我们当前的这个ORACLE数据库存储中文不会出现乱码问题呢?因为我们在安装Oracle数据库的时候指定了字符的编码方式是支持简体中文的。大家以后在使用MySql数据库的时候,安装之前必须手动设置该数据库采用的字符编码方式,如果采用MySql数据库默认的字符编码方式的话,是会出现中文乱码问题的。大家一定要注意手动修改MySql数据库的字符编码方式。还有一种情况本身数据库是支持简体中文的,但是在保存之前数据已经是乱码,保存之后必然还是乱码。

三、数据展示过程中的乱码

  假如服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就会出现乱码。对于response乱码,只需要在服务器端指定一个编码字符集,然后通知浏览器按照这个字符集进行解码就可以了。

  有三种方式,我一般使用第三种就够了:
  1、 //设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置
    response.setCharacterEncoding("utf-8");
    //通知浏览器服务器发送的数据格式
    response.setHeader("contentType", "text/html; charset=utf-8");

  2、 //设置服务器端的编码
    response.setCharacterEncoding("utf-8");
    然后在浏览器使用utf-8进行解码

  3、 //通知浏览器服务器发送的数据格式
    response.setContentType("text/html; charset=utf-8");

  一般可以这样做,以防万一:
  A、设置服务器端的编码
    response.setCharacterEncoding("utf-8");
  B、通知浏览器服务器发送的数据格式
    response.setContentType("text/html;charset=utf-8");
  C、浏览器使用utf-8进行解码

四、JSP页面设置UTF-8

jsp页面顶部添加

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

jsp页面<head>标签里面添加

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

Java Web 开发中的中文乱码与解决方式的更多相关文章

  1. Java Web开发中路径问题小结

     Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  2. web开发中遇到的乱码问题

    相信大家在web开发中会遇到乱码问题,有页面乱码,请求乱码,数据库乱码等等,下面我这边列举一下针对不同情况的乱码的解决方案: 1.相应数据乱码: //只需要在后台接口方法里面的开头写上这样一句话指定响 ...

  3. Java Web 开发中路径相关问题小结

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...

  4. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  5. java web开发中常用的协议的使用和java-web 常见的缓冲技术

    一.DNS协议 作用将域名解析为IP   类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...

  6. Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)

    看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...

  7. web开发中目录路径问题的解决

    web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...

  8. Java项目开发中实现分页的三种方式一篇包会

    前言   Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...

  9. JAVA WEB开发中的资源国际化

    为什么要国际化? 不同国家与地区语言,文化,生活习惯等差异.在数字,时间,语言,货币,日期,百分数等的不同. 两个名词: I18N:即资源国际化,全称为Internationalization,因为首 ...

随机推荐

  1. oracle sql语句大全

    ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CHECK (检查)--检查在约 ...

  2. 关于egg.js的安全延伸思考

    我看到全部的安全基于围绕http来操作,那么如果我只用websocket传输数据,是不是就会好很多?

  3. 3,fiddler手机端的设置

    1,首先设置手机端代理 选择链接的无限网,设置其代理 2,安装手机证书 只有在启动fiddler的时候手机才能够上网, 在浏览器,输入主机ip+fiddler端口的地址 进入后是下边的界面 点击下载证 ...

  4. pytest 一.安装和使用入门

    pytest --fixtures Python版本: Python 2.7.3.4.3.5.3.6.Jython.PyPy-2.3 平台:Unix / Posix和windows PyPI包名称:p ...

  5. Scrum冲刺阶段5

    成员今日完成的任务 人员 任务 何承华 学习后端设计 陈宇 后端设计 丁培辉 学习后端设计 温志铭 日程添加界面设计(后半段设计) 杨宇潇 日程添加界面设计(后半段设计) 张主强 服务器构建学习 成员 ...

  6. Mac 系统搭建ThinkPHP3.2

    PHP3.2完整包目录 拷贝两个文件 index.php 和ThinkPHP目录到服务器目录中,我已经设置服务器目录与eclipse工作空间为同一个 创建TestThinkPHP 项目 Eclipse ...

  7. javascript之原型链

    JavaScript 中,万物皆对象!(对于编程而言,可以说万物皆对象.) js中的原型链的作用时什么呢? 我自己的理解是,给一个人赋予一些技能, function people(name,age,s ...

  8. 绕过D盾的php一句话

    d_dun.php <?php $a = '小狗狗你好啊'; $b = '小盾盾你好啊'; foreach ($_REQUEST as $key => $value) { $$key = ...

  9. .gvfs: Permission denied

    命令行输入umount .gvfs rm -rf .gvfs

  10. 【慕课网实战】三、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    前置要求: 1)Building Spark using Maven requires Maven 3.3.9 or newer and Java 7+ 2)export MAVEN_OPTS=&qu ...