APP下载

Java Web项目开发中的中文乱码问题与对策

2020-05-21张彦芳

电脑知识与技术 2020年9期
关键词:解码编码

张彦芳

摘要:在当下的网络时代,Java Web技术发展迅速,已经成为市场上主流的web开发技术之一,为越来越多的web应用开发人员所使用。但是,在进行Java Web项目开发时,经常出现的中文乱码问题给应用开发带来了不少的麻烦。该文具体分析了Java Web项目开发中常见的中文乱码问题,并给出了相应的对策。

关键词:中文乱码;编码;解码;Servlet

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2020)09-0096-02

1 引言

目前,网络高速发展,web开发应用非常广泛,Java Web成为市场上非常流行的web开发技术之一,越来越多的人开始学习并使用Java web开发项目。但是,我们在使用Java web技术开发项目时不可避免用到中文,在Java web中使用中文经常会出现中文乱码问题,严重影响了项目的开发与应用,解决中文乱码问题迫不及待。本文具体分析了实际应用中遇到的中文乱码问题,并给出了相应的对策。

2 产生中文乱码的原因

计算机中存储数据都是以二进制的形式存储。当我们输入中文字符时,需要把中文字符转换成二进制进行存储,这时就会发生字符和字节之间的转换。将字符转换成字节的过程,我们称为编码,将字节转换成字符的过程称为解码。无论是编码还是解码,字符与字节之间的转换都是通过查码表来完成的,如果在解码时采用的码表和编码时采用的码表不一致,就会产生乱码的问题。

3 Java Web中常见的中文乱码问题与对策

3.1访问JSP页面时出现中文乱码

通过浏览器访问JSP页面时,经常会在浏览器中看到乱码,出现乱码的根本原因是使用的编码不支持中文。在JSP页面中使用的编码默认为“IS0-8859-1”,这种编码方式不兼容中文字符。常用的支持中文字符的编码有GB2312,GBK和UTF-8。我们可以在JSP文件的page指令中将编码修改为支持中文的编码即可。例如:< %@page pageEncoding=”UTF-8”%>.

这种方式,每次新建JSP文件时,都要在page指令中设置编码,比较麻烦。如果使用的是Eclipse软件开发java Web项目的话,可以直接修改JSP页面的默认编码为UTF-8。方法为:在Windows菜单下选择preferences,在其级联菜单下选择Web,并在web的子菜单JSP Files中谩置Encoding为UTF-8,这样设置后,再新建JSP文件,文件默认的编码就变为UTF-8了。

3.2 中文输出乱码问题

在Servlet中输人中文字符时,如果在浏览器页面看到的内容是若干个“?”,就说明产生了中文乱码。那么,这个乱码是如何产生的呢?当我们使用response对象的输出流进行编码时,采用的是IS0-8859-1的字符码表,这个字符表是不支持中文的,这时在IS0-8859-1字符码表中就查不到中文字符对应的码,当查不到的时候就会给这些中文字符统一编码为对应个数的“63”。浏览器接收到数据后进行解码,浏览器解码时会采用默认的支持中文字符的字符码表GB2312,在GB2312字符表中,“63”对应的字符是“?”,将“63”解码为“?”,就产生了乱码。具体分析过程见图1。

解决这种输出乱码问题有两种方法:一是可以使用HttpServletResponse接口提供的setCharacterEncoding0方法,设置字符的编码方式。我们知道UTF-8字符集支持中文,我们通过代码设置字符的编码方式为字符码表UTF-8,在浏览器中设置浏览器的编码方式也为UTF-8,这样就能解决这个中文乱码问题。二是不管编码还是解码方式都使用HttpServletResponse对象提供的方法来设置。我们通过response.setCharactorEncod-ing(“UTF-8”);i置编码使用UTF-8字符码表。通过使用

response. setHeader(“Content-Type”,“text/html; charset=UTF-8”);设置浏览器使用UTF-8字符表进行解码,编码解码使用的码表一致了,就不会出现中文乱码问题。这两条语句的功能还可以通过一句代码来实现,即response.setContentTypef“text/html;charset=utf-8”1:

3.3 請求参数的中文乱码问题

在实际项目开发中,用户的信息常常经由表单来提交,用户在填写表单时,不可避免地要填写中文信息。当提交这些用户信息时,浏览器会传递这些表单信息。而浏览器在传递请求参数时,采用的编码是UTF-8,但是在解码的时候使用的是默认的字符集IS0-8859-1,这样就导致了乱码问题的出现。为了避免中文乱码的出现,可以通过HttpServletRequest接口提供的setCharacterEncoding0方法设置request对象的解码方式为UTF-8,使解码的字符集和编码的字符集一致。

3.4 中文文件下载出现的中文乱码问题

在web项目开发中,常常需要实现文件的上传与下载功能,比如图片的上传与下载、邮箱中附件的上传与下载等。在下载文件时,文件的名字如果是中文的,就需要在程序中对中文乱码进行处理。如果不处理,通过浏览器下载文件时,要下载的文件名称就显示不出来。Servlet API中定义了一个URLEncoder类。我们通过这个类中定义的encoding0方法,可以将文件路径中的字符串以指定的编码进行输出。经过URL编码后,HTTP消息头中的数据转换成通用的符号,在下载文件时就不会出现乱码问题了。

4 使用过滤器对全站实现统一编码,解决中文乱码问题

在以上所述的解决中文乱码问题的方法中,大部分都是在Servlet中设置编码方式,这种方式也是很有效的。但是,在实际web开发中,会出现很多Servlet,每个Servlet中都进行编码的设置,会重复书写大量的代码,给开发工作带来麻烦。为了解决这个问题,我们可以在过滤器中对获取到的请求和响应消息进行编码,将全网站使用的编码统一,从而解决中文乱码问题。使用过滤器可以极大地提高控制效果,同时也降低了开发成本,提高了工作效率。使用过滤器处理中文乱码时,根据请求方式的不同,处理乱码的方式也不同。

4.1 POST方式

用户请求时,如果采用的请求方式是POST,那么请求参数会存放在消息体中,可以使用setCharactorEncoding0进行编码设置,这个方法只对消息体有效。

4.2 GET方式

如果用户请求使用的方式是GET,这种请求方式,请求参数是存放在消息头中的,不能直接使用setCharactorEncoding0进行编码设置。需要通过获取URI参数进行设置。但是每次遇到GET请求方式时,都需要单独进行处理,会很麻烦。为此,可以先定义一个HttpServletRequestWrapper类的子类,在子类中对getParameter0方法重写,从而获取请求参数,再对请求参数进行编码设置,从而解决中文乱码问题。

public String getParameter(String name){

Stringstr= super.getParameter(name);

if (str== nuID

return null;

String method= super.getMethod0;

if(”get”.equals(method》{

try{

str= new String(str.getBytes(”iso-8859-1”),”utf-8”);

) catch (Exception e){

throw new RuntimeException(e);

Retum str;

5 结束语

Java Web技术是在计算机领域发展人员的必备利器之一,在使用Java Web技术开发项目时,开发人员会遇到各种各样的中文乱码问题,通过对具体问题的具体分析,找到切实有效的方法去解决,才能保障项目开发能够顺利完成。

参考文献:

[1]刘长生,谢强,丁秋林.Java应用中的汉字乱码问题分析[J].计算机技术与发展,2006,16(1):158-161.

[2]王卫,李天琦,汤伟,等.基于JSP技术项目开发中中文乱码问题研究[Jl.电脑编程技巧与维护,2018(8):38-39,61.

[3]任平红,陈矗,郑秋梅.Java中文乱码问题研究[J].计算机技术与发展,2013,23(3):117-120.

[4]刘冰.Java编程中中文问题的产生及其解决方案[Jl.現代计算机:专业版,2010(3):105-107,116.

[5]贾晓芳,沈泽刚.Java Web应用开发中的常见乱码形式及解决方法[Jl.软件导刊,2017,16(4):214-216.

【通联编辑:代影】

猜你喜欢

解码编码
编码中心(一)
中国编码APP
《解码万吨站》
《解码万吨站》
《解码万吨站》
基于SAR-SIFT和快速稀疏编码的合成孔径雷达图像配准
《全元诗》未编码疑难字考辨十五则
子带编码在图像压缩编码中的应用
解码eUCP2.0
NAD C368解码/放大器一体机