Java Web 开发中的中文乱码与解决方式
乱码产生的原因
不管是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 开发中的中文乱码与解决方式的更多相关文章
- Java Web开发中路径问题小结
Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...
- web开发中遇到的乱码问题
相信大家在web开发中会遇到乱码问题,有页面乱码,请求乱码,数据库乱码等等,下面我这边列举一下针对不同情况的乱码的解决方案: 1.相应数据乱码: //只需要在后台接口方法里面的开头写上这样一句话指定响 ...
- Java Web 开发中路径相关问题小结
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...
- Java Web开发中MVC设计模式简介
一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...
- java web开发中常用的协议的使用和java-web 常见的缓冲技术
一.DNS协议 作用将域名解析为IP 类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...
- Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)
看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...
- web开发中目录路径问题的解决
web开发当中,目录路径的书写是再常用不过了,一般情况下不会出什么问题,但是有些时候出现了问题却一直感到奇怪,所以这里记录一下,彻底解决web开发中路径的问题,开发分为前端和服务端,那么就从这两个方面 ...
- Java项目开发中实现分页的三种方式一篇包会
前言 Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...
- JAVA WEB开发中的资源国际化
为什么要国际化? 不同国家与地区语言,文化,生活习惯等差异.在数字,时间,语言,货币,日期,百分数等的不同. 两个名词: I18N:即资源国际化,全称为Internationalization,因为首 ...
随机推荐
- SQL Server 2008 通过C# CLR 使用正则表达式
参考文章 MSSQLSERVER接入c#clr程序集,使c#函数变sql函数 正则表达式30分钟入门教程 SQL中采用Newtonsoft.Json处理json字符串 操作步骤 1.新建项目-> ...
- 深入理解HashMap和CurrentHashMap
原文链接:https://segmentfault.com/a/1190000015726870 前言 Map 这样的 Key Value 在软件开发中是非常经典的结构,常用于在内存中存放数据. 本篇 ...
- java中实现对list的模糊查询
比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么 ...
- clean-room 洁净室软件工程
众所周知,软件工程的主要目的是提高软件的开发效率和软件质量.近年来发展起来的洁净室软件工程(cleanroom software engineering)提出了用统计的质量控制方法管理软件 ...
- jquery.validate 远程验证remote使用详解
目的: 试了一下远程验证,试了好几次,得出小结,可以记录下,提醒以防绕路. ----------------直接贴图,省事明了---------------- 1.引用js 2.demo的html & ...
- windows service 2008 R2 升级 sp1遇到的问题
因为我的程序是以vs2015开发的,所以在在布署windows service 2008 R2 项目的时候报出 红框里的错,说明要安装.net framework4.6. 感觉so easy,下载一个 ...
- 内嵌圆角CSS实现
前言 开发项目时,经常会遇到如上图左上角和右上角这种内嵌的圆角效果,在以前css3还没有普及时不用说一张图片搞定,但是到现在我们完全可以用css去实现. 实现 第一步:思路 仔细观察这个小缺角,它其实 ...
- ASP.NET Core Web API 如何 数据分页 以及遇到'OFFSET' 附近有语法错误
最近领导叫我做的一个B/S端的小项目,突发奇想想用到core web api 今天写数据分页的时候,就想着 用linq分页查询吧,直接上代码 _context.Skip(Size * (PageNum ...
- mysql约束以及数据库的修改
一.约束 1.约束保证数据完整性和一致性. 2.约束分为表级约束和列级约束. (1)表级约束(约束针对于两个或两个以上的字段使用) (2)列级约束(针对于一个字段使用) 3.约束类型有: (1)NOT ...
- nginx做yum源
我这边环境是原先有个nginx只是做了代理转发,现在需要在通过nginx做yum源方便后期安装源 1.原先的配置代理转发,为不影响原先配置及端口,在http中最末尾加“include include ...