关于Java Web中中文乱码问题的探讨
2020-04-10耿学
摘 要:Java Web网站开发中经常出现中文乱码问题,初学者在解决此类问题时非常耗费时间。以eclipse开发环境为例,针对初学者在Java Web开发中经常出现的字符编码问题,分别从常见字符编码种类、设定方式、不同页面类型代码编写差异方面进行总结,并对常见中文乱码产生原因进行分析并给出相应的解决方案,为解决中文乱码问题提供相应的思路。
关键词:Java Web;字符编码;中文乱码;eclipse
中图分类号:TP311 文献标识码:A 文章编号:2096-4706(2020)01-0074-03
Abstract:In the development of Java Web,the problem of Chinese messy code is often occered,which is very time consuming. Taking the eclipse development environment as an example,aiming at the character coding problems that often appear in the Java Web development for beginners,this paper summarizes the common types of character coding,setting methods,and the differences in code writing of different page types,and analyzes the causes of common Chinese character scrambling and gives the corresponding solutions,so as to provide the corresponding ideas for solving the problem of Chinese character scrambling.
Keywords:Java Web;character encoding;Chinese messy code;eclipse
0 引 言
Java语言是一種面向对象的语言,它具有平台无关性、较好的安全性、简单易用等优点,基于Java语言的Web开发越来越受到广大编程爱好者的青睐。在Java Web应用程序中有多种类型的页面构成,如HTML、JSP、Servlet等,而不同的页面类型在字符编码设定方式有所差异,初学者易混淆它们之间的区别,导致开发中出现中文乱码问题。接下来,从常见的字符编码方式、设定方式、不同页面代码编写区别方面分别进行介绍。
1 几种常见的字符编码方式
计算机采用二进制进行信息存储,任何语言在计算机存储时必须进行编码。在Java Web开发中,JSP和Java是基于字节流的,也就是通用字符集Unicode,使其具有良好的跨平台性,但其在编译成class文件或Servlet文件,或是与其他类型文件进行交互时必存在转码,转码期间的编码或解码不正确必产生乱码,以下是常用的字符编码方式:
(1)Unicode编码。Unicode基于通用字符集,它为每种语言中的每个字符都设定了统一并且唯一的二进制编码,能实现跨平台、跨语言的转换,Java语言内部即使用2个字节的Unicode编码。
(2)GBK编码。GBK是在国家标准GB 2312基础上扩容后兼容GB 2312的标准,其采用双字节编码,用于解决汉字编码问题而提出,能够显示所有的汉字。
(3)UTF-8编码。UTF-8是用1到4个字节编码的Unicode字符,用以解决国际上不同国家标准导致的一个代码值对应不同字母的问题,UTF-8是一种多字节编码,它对英文使用8位(即1个字节),中文使用24位(3个字节)来编码。
(4)ISO-8859-1编码,又称Latin1。该编码向下兼容ASCII,常用于欧洲国家,因其采用的是8位的单字节编码,其在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃,因此很多协议都采用这种编码方式,例如MySQL和eclipse默认是这种编码方式。但是,它表示的字符范围很窄,无法表示中文字符。
2 字符编码设定方式
2.1 eclipse开发环境字符编码设置方式
eclipse因其免费且使用方便成为广大Java Web开发者的首选,使用eclipse开发应用程序时,为了避免出现中文乱码问题,可以设置页面的默认编码方式为UTF-8,主要设置3个位置,一是设置工作空间编码,通过Windows-Preferences-Workspace-Text file encoding进行设置;二是设置HTML页面编码,通过Windows-Preferences-Web-HTML Files-Encoding设置;三是设置JSP页面编码,通过Windows-Preferences-Web-JSP Files-Encoding进行设置。
2.2 通过代码编写设定字符编码方式
在Java Web代码编写中,一般有两种设定字符编码的方式,一是通过Content-Type(内容类型)属性设定字符编码。Content-Type是响应的HTTP内容类型,又称为MIME类型。MIME类型为浏览器呈现网页时使用的编码格式,用于告知浏览器要接收的数据是什么类型,这样浏览器才能知道如何显示这些数据;二是通过pageEncoding属性设定字符编码方式。该属性一般作为page指令的属性,该属性用于定义JSP页面的编码格式,JSP页面中所有代码都使用该属性指定的字符集,如果该属性值设定为ISO-8859-1,那么这个JSP页面就不支持中文字符。
2.3 通过配置文件设定字符编码方式
HTTP协议请求方法采用GET时,因其传递参数的字符编码方式为ISO-8859-1,而解码是UTF-8或GBK,两者不一致导致的中文乱码问题,可通过修改Tomcat服务器的配置文件server.xml中的
3 不同页面类型代码编写差异
3.1 HTML页面
HTML页面如果未指定Content-Type,默认为text/HTML,
所以,在HTML中有两种代码表示形式,分别为
3.2 JSP页面
JSP一般通过page指令设定字符编码方式,如<%@ page language="java" contentType="text/html;charset= UTF-8" pageEncoding="UTF-8"%>,其中,pageEncoding和contentType均能设定编码格式,但是两者优先级、作用域不同,设定JSP源文件字符集时,优先级为pageEncoding>contentType。如果都没有设定,默认ISO-8859-1。设定响应输出的字符集时,优先级为contentType>pageEncoding。如果都没有设定,默认ISO-8859-1。一个JSP的源文件需要经过三个阶段,两次编码,才能完成一次完整的输出:第一阶段,通过pageEncoding设定的编码方式将JSP编译成Servlet(.java)文件;第二阶段,由Javac的Java源码至Java ByteCode的编译,也就是从UTF-8到UTF-8;第三阶段,按照Content-Type设定的编码方式将内容输出到浏览器。
3.3 Servlet页面
对于Servlet接收到的请求和处理后的响应,无法通过指令或是内置对象设定编码方式,可通过请求接口HttpServlet Request和响应接口HttpServletResponse传递的对象参数设定编码方式,如request.setCharacterEncoding("UTF-8")用于设定请求体的编码方式为UTF-8,response.setContentType("text/html;charset=UTF-8")用于设定响应体的编码方式,需要注意的是两种设定方法只能在response.getWriter();之前使用才有作用。
4 几种导致中文乱码的原因及解决方法
4.1 HTML页面访问出现乱码
在HTML中,编码方式已经设置为UTF-8或GB2312(GBK),仍然会出现乱码。在HTML文件中,头部的"content-type"中设定的"charset"是告知浏览器打开该文件的编码方式,实际上,HTML文件是有编码格式的,也就是存储时的编码方式,只有两者一致才不会导致中文乱码,在用记事本存储HTML文件时可以选择存储时编码方式,而eclipse可通过Windows下的properties修改HTML的默认存储时编码方式。
4.2 JSP页面访问出现乱码
在JSP页面中,页面的pageEncoding和Content-Type属性均设置为UTF-8,在页面传递参数过程中仍出现中文乱码问题,导致此问题的原因为请求方法的使用问题,GET和POST是HTTP协议中最常用的两种请求方法,用GET发送的数据会追加到URL后面,而POST发送的数据是放在请求体内。通过page指令设定的字符编码方式作用于整个JSP页面,对请求头部信息有效,但不能作用于请求体部分,所以用GET方法发送的请求可正常显示,而用POST方法发送的请求会出现中文乱码,该种情况可通过使用request内置对象设定编码,如request.setCharacterEncoding("UTF-8")。
4.3 Servlet页面访问出现乱码
由于浏览器默认使用UTF-8进行编码,而Servlet使用ISO-8859-1进行编码,传输和接收方编码不一致会导致中文乱码的产生。对于请求的数据存在中文的情况,可通过request.setCharacterEncoding("UTF-8")进行编码设置,对于响应的数据存在中文的情况可通过response.setContentType("text/html;charset=UTF-8")进行设置,但是,该设置必须在获得到输出流之前完成。另一种思路是通过Servlet过滤器解决整个应用的中文乱码问题,通过配置web.xml,指定字符编码类型和过滤器关联的URL,实现过滤器对Servlet请求和响应的字符编码的自动检查和处理。
4.4 数据库访问出现乱码
MySQL中中文数据正常显示,但Java Web访问数据库出现乱码。Java Web访问数据库是通过客户端JDBC驱动来完成的,用JDBC来存取数据要和数据的内置编码保持一致,如果MySQL中编码方式为GBK,而Servlet或JSP为UTF-8,会因编码与解码不一致导致乱码,可以在JDBC的数据库访问URL后增加设置字符编码的参数解决:url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"。
5 结 论
Java Web程序开发中出现字符乱码的情况很多,其根本原因是字符传递过程中编码不一致。解决乱码的根本方法是统一编码,先从运行环境、服务器、浏览器等外围统一编码,然后到编程语言内部统一控制,逐步查找问题,并采取相应方法。Java Web技术应用广泛,其与多种开发技术结合使用期间会出现乱码问题,程序人员应当根据出现乱码的位置及特点细致分析,提出解决办法。
参考文献:
[1] 张学诚.Java WEB开发中的中文乱码问题解决方法 [J].电脑知识与技术,2018,14(27):62-63.
[2] 王卫,李天琦,汤伟,等.基于JSP技术项目开发中中文乱码问题研究 [J].电脑编程技巧与维护,2018(8):38-39+61.
[3] 贾晓芳,沈泽刚.Java Web应用开发中的常见乱码形式及解决方法 [J].软件导刊,2017,16(4):214-216.
[4] 任宪臻,梁宏英.JSP页面中文乱码解决方法 [J].数字技术与应用,2017(1):154+157.
[5] 张剑.基于JSP技术的中文乱码原因分析及对策研究 [J].山西电子技术,2016(6):75-76.
[6] 赵璞.Java Web程序开发中字符乱码的原因与解决办法 [J].电脑编程技巧与维护,2016(20):24+27.
[7] 冯中毅,董海棠,岳建斌,等.Java Web开发中的乱码问题分析及解决方案研究 [J].科技信息,2013(19):92+101.
[8] 张健.基于java web中文乱码问题的研究 [J].电子世界,2014(18):371.
作者简介:耿学(1986-),女,汉族,山东高青人,助教,毕业于太原理工大学,硕士研究生,研究方向:软件开发。