乱码产生的原因

  不管是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. git hub命令,上传到github

    git hub命令,上传到github   1,git  init;      初始化 2,git   config   --global   user.email  " ....@.... ...

  2. CentOS如何手动增加 删除swap区

    SWAP是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的.它类似于Windows中的虚拟内存.在Windows中,只可以使用文件来当作虚拟内存.而linux可以文件或者分区来当作 ...

  3. php JS 导出表格特殊处理

    但是这样导出身份证号会变为科学计数: 解决方法就是: 我们了解一下excel从web页面上导出的原理.当我们把这些数据发送到客户端时,我们想让客户端程序(浏览器)以excel的格式读取 它,所以把mi ...

  4. java之servlet学习基础(二)

    上一次写到Servlet的实现方法,主要还是通过继承HttpServlet来实现Servlet.下面主要是回顾一下HttpServletRequest和HttpServletResponse对象中的一 ...

  5. python 数据库mysql、redis及发送邮件

    python 关系型数据库链接使用--mysql import pymysql # 引用mysql模块 # 创建连接,指定数据库的ip地址,账号.密码.端口号.要操作的数据库.字符集coon = py ...

  6. Pancake Sorting LT969

    Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, t ...

  7. Android.mk学习

    2019-03-31 学习变量 $(call my-dir) /usr/bin2/android-ndk-r16/build/core $(CLEAR_VARS) /usr/bin2/android- ...

  8. Xshell连接不上阿里云服务器

    心血来潮买了一台1核2g内存,外加40g系统盘的阿里云ecs服务器,在配置xshell连接服务器一直无法连接,试了很多种方法,各种心累,不过最后还是找到了原因,是因为在服务器上没有配置安全组规则,附上 ...

  9. OvO

    OvO 知乎 网易云 图书馆 B站 小众软件 360极速浏览器下载 开源下载工具 下载地址1 下载地址2 下载地址3

  10. Java学习笔记day_01

    Java学习笔记(复习整理) 虽然不知道该怎么写,但是不起步就永远不知道该怎么做..刚开始可能会写的很差劲,但会一点一点变好的. 本笔记是以我按照传智播客的视频和Java核心思想来学习,前面的基础部分 ...