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,因为首 ...
随机推荐
- Spring Boot Web应用开发 CORS 跨域请求支持:
Spring Boot Web应用开发 CORS 跨域请求支持: 一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 1. JSONP只能实现 ...
- c#简单的数据库查询与绑定DataGridView。
1配置文件 (两种写法) <connectionStrings> <add name="connStr" connectionString="se ...
- Js 常用调试的方法
A 使用alert() 和document.write() 方法监视变量值 如果要中断代码的运行,监视变量的值,则使用alert() 方法: 如果需要查看的值很多,则使用document.write ...
- 获取ADO连接字符串
自己如何获取ADO连接字符串 有时候我们参考网上的ADO连接字符串写未必就能连接上数据库.今天详细介绍下这个很流行的如何获取ADO字符串的方法,就能很容易直观看到这个连接字符串是否真能连接上数据库.编 ...
- python 调用shell hive sql
def generate_csv_source(data_file): #判断文件是否存在 if not os.path.exists(data_file): # 拉取hive表数据 cmd_sql ...
- [Solution] JZOJ-5818 做运动
[Solution] JZOJ-5818 做运动 Time Limits:2000ms Memory Limits:524288KB Description 一天,Y 君在测量体重的时候惊讶的发现,由 ...
- Open/Close Port in Centos
1. Show status /etc/init.d/iptables status 2.Set Port iptables -I INPUT -p tcp --dport 80 -j ACCEPT ...
- python_flask 基础巩固 (DEBUG模式)
默认情况下flask不会开启DEBUG模式,开启DEBUG模式后,flask会在每次保存代码的时候自动的重新载入代码,并且如果代码有错误,会在终端进行提示. 开启DEBUG模式有四种方式: 1.直接在 ...
- Connect To Ubuntu 16.04 / 17.10 / 18.04 Desktop Via Remote Desktop Connection (RDP) With Xrdp
[1] https://websiteforstudents.com/connect-to-ubuntu-16-04-17-10-18-04-desktop-via-remote-desktop-co ...
- js 原型链解密
1.对象继承 javaScript的继承不是通过class实现的,而是通过“原型对象”(prototype). 1.每一个函数都有一个原型对象 2.每一个实例对象都有一个_proto_属性 2.原型链 ...