admin 管理员组

文章数量: 1184232


2024年3月12日发(作者:dart语言的gc)

科学论坛 

啊I 

浅析JSP中文乱码解决方案 

(1.黑龙江信息技术职业学院评估办黑龙江哈尔滨

巍冯宇 

黑龙江哈尔滨150025) 150025: 2.哈尔滨市69联中计算机室

[摘 要]我们在浏览中文网站时会碰到一些看不懂的信息,这种情况就是乱码现象。在世界各国乱码问题都会出现。那么,程序开发人员如何在写程序 

的时候避免发生乱码现象,本文以JSP为例介绍了五种在JSP开发平台下能够避免中文乱码发生的方法。 

[关键词]编码中文乱码指令对象 

中图分类号:TN919.3+1 文献标识码:A 文章编号:1009—914X(2010)O1 0131 02 

1字符集和编码相关概念 

计算机在世界范围内被广泛的应用,针对不同肤色的人种、不同的语言, 

计算机都能给予我们人类帮助。那么,他是怎样识别不蚓的命令?每个困家 

或地区都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码、 

中国的GB2312 80、日本的JIB等,作为该国家或地区信息处理的基础,有 

着统一地区编码的重要作用。世界上每个国家的语言信息都被规范,而讨‘算 

机语言的字符集大多采用包含了所有字符的Unicode码。 

解决乱码问题,首先要熟悉一些基本的概念。 

计算机内码是操作系统中用来表示字符的编码。不管我们创建何种语言 

的文档或程序,在计算机中都是以内码的形式存储的,内码分为单字节内码 

(Single—Byte Character Sets,简称:SBCS),可以支持256个字符编码;双字 

节内码(Double—Byte Character Sets,简称:DBCS),可以支持65000个字符 

编码,主要用来对东方困家的繁多字符进行编码。 

Unicode码,国际组织制定的可以容纳世界上所有文字和符号的字符编码 

方案。它为每种语言中的每个字符设定了统’并且唯‘的二进制编码,以满 

足跨语言、跨平台进行文本转换、处理的要求。而在非Unicode环境下是 

通过指定的转换袁将非Unicode的字符编码转换为同‘字符对应的系统内 

部使用的gnicode编码,这种技术称为代码页(Codepage)转换表。而在 

Unicode和字符内码之间可以通过CodePage来进行匹配。CodePage是一个 

经过挑选的以特定顺序排列的字符内码列表,对于早期的单字节内码的语种, 

CodePage中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出‘ 

个对应的内码。对于双字节内码,给出的是MultiByte到Unicode的对应表, 

这样就可以把以Uni code形式存放的字符转化为相应的字符内码。 

对于Jsp编程人员来说,IS08859—1(Latin—i)一定不陌生,它是被使用较 

多的一个CodePage,它属于西欧语系,也是Java网络传输使用的标准字符集。 

GB2312—80是在国内计算机信息技术发展初始阶段制订的汉字CodePage,其 

中包含了大部分常用的一、二级汉字和符号。该字符集是几乎所有的中文 

系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。GBK 

是GB2312-80的扩展,是向上兼容的。它包含了21003个汉字和883个符 

号,其编码范围是0x8140 ̄OxFEFE,剔除高位Ox80的字位,其所有字符都 

可以对应到Unicode 2.0,也就是说Java实际上提供了对GBK字符集的支 

持。 GB18030 2000(GBK2K)在GBK的基础上进一步扩展了汉字,增加了 

藏、蒙等少数民族的文字。GBK2K从根本上解决了字位不够、字形不足 

的问题。 

2如何解决中文乱码问题 

因为大部分编程语言是西方人发明的,所以很多语言的默认编码使用西方 

编码方式:一些比较受欢迎的编程语言会考虑到国际化的问题,所以将各种字 

符都转换成包含所有字符的Unicode,那么如果编译器或者解释器没办法获得 

代码中的编码信息,就可能造成错误的转换。这就是产生乱码最直接的两个 

原因。在网页显示中文的过程中经常出现乱码,而导致中文乱码原因有很多, 

所以对于此类问题没有哪种技术是可以完全解决的。但是只要编程人员的防 

护措施做的全面就可以避免这类事情发生。 

2.1加入page指令来指定页面使用的字符集。 

P a g e指令的作用域是整个J S P页面,格式如下:<%@P a g e 

contentType text/html charset GBK language= java import- user. 

UserManage,dto.UserDTO %>,为了程序的可读性大都把该指令放在页面的 

最开始的位置。因为每个人的浏览器默认的编码字符集不尽相同,经常因为 

编码的原因网页中的中文无法正常显示,那么我们用指令强制指定网页显示所 

用的字符集之后,浏览器就可以找到我们需要的方式来解析我们的网页了。 

每个页面可以包含多个page指令,但是除了import属性外,多个指令中不可 

以有重复的属性出现。 

2.2 request对象中的setOharacrerEncodi ng方法 

JSP包含4个非常重要的隐含对象:P ag e,r e qu e st,s e s sj o n, 

app¨cation。这4个对象的作用域不同,所包含的方法和功能也不相同。 

JSP获取页面参数一般采用系统默认的编码方式,如果页面参数的编码类型和 

系统默认的编码类型不一致,很可能会出现乱码。解决这类乱码问题的基本 

度可以作为机组性能分析方法加以采用。 

3参数优化 

优化目标是在保证计算精度的前提下尽可能的减少计算煤耗所需要的参 

数个数,同时,也综合考虑了学习样本数,隐层结点数,迭代次数等与神经网络 

仿真精度相关的模型结构参数。通过对上述参数的优化,建立性能分析系统 

的基本架构。 

神经网络方法建立了输入参数和输出参数之间的 种映射关系,具有一定 

的模糊计算能力。在本次设计中采用热平衡法计算出的发电煤耗已经精确反 

映了各输入参数对煤耗的影响,因此在此基础上用神经网络方法学习和训练得 

出的发电煤耗很大程度上也反映出关键参数和主要参数与发电煤耗之问的映 

射关系。隐层结点数的个数并没有・定的限制, 一般选用下面的公式: 

隐层结点数=输入结点数+(一个1O以内的数) 

所以当输入结点数为12时,分别取隐层结点数为l2,17,22作为比较, 

得出最佳的隐层结点数。当输入结点数为17时,分别取隐层结点数为1 7, 

22,27作为比较,得出最佳的隐层结点数。学习样本的选取‘般力求可以覆 

盖整个煤耗,功率,主蒸汽流量,供热抽汽流量的范围。在此次仿真中选取学 

习样本数为75和150两类来进行比较。训练样本数一般为学习样本数两 

倍,选取的时候也力求可以覆盖整个煤耗,功率,主蒸汽流量,供热抽汽流量的 

范围。另一方面随着迭代次数的增加,学习误差不断变小,而训练误差是先变 

小后变大,所以训练误差最小的点所对应的次数为误差最小的迭代次数。但 

是从图7并不能精确的看出具体多少次迭代后,训练误差最小。所以我们就 

需要减少总迭代次数,同时减小误差报告间隔,得到确切的使训练误差最小的 

迭代次数。 

结语 

本文在分析总结常规汽轮机性能分析方法的基础上,选择并建立各典型二f: 

况的训练样本参数,运用BP神经网络的自学习能力,通过对仿真和学习误差 

的对比分析,完成发电厂热电联供机组的BP网络学习训练,建立了供热机组 

的性能指标(发电煤耗)与一些主要参数之问的关系,减少了实际在线运行系统 

对参数数量和正确度的强依赖关系,并将之运用到在线的汽轮机性能分析中 

去,减少了在线系统对热力参数需求的数量,提高了在线系统的可靠性。应用 

神经网络模型计算与常规方法计算结果的误差达到0.5%以内,符合工程应用 

的要求,证明本次设计建立的模型是可用于现场实际的,具有‘定的实用性。 

参考文献 

[1]林万超.火电厂热系统节能理论[M].西安:西安交通大学出版社. 

1994. 

[2]汪孟乐.火电厂热力系统分析[M].北京:水利电力出版社.1992. 

[3]胥建群,周克毅,张雄等.关于常规热平衡法、等效焓降法整体算法 

和等效焓降法局部简化算法的一致性的探讨[J].汽轮机技术.2000.8. 

[4]SONGSONG LI,TOSHIMI OKADA.A MODIFIED ERROR BACKPROPAGATION 

ALGORITHM FOR COMPLEX—VALUE NEUPAL NETWORKS.International Journal 

of Neural Systems.Vo1.15,No.6(2005). 

[5]侯子良.再论火电厂厂级监控信息系统(SIS),见电站自动化信息化 

学术技术交流会议论文集.南京.2002.6. 

[6]何悦盛,叶春,杨波等.人工神经【斓络在汽轮机组中的仿真与故障识 

别[J].电网技术.2002,26—5(5). 

科技博览} 13l 

科学论坛 

I■ 

方法是在页面获取参数之前,强制指定requeSt获取参数的编码方式。re 

quest对象的作用域是客户端的一个请求,因为完成一个请求过程可能涉及几 

个页面,所以request对象的作用域可以横跨几个页面。在上一个方法我们 

指定了网页的内容用什么样的字符集来表示,那么他可以发挥作用的前提就是 

网页解析的内容确实是使用指定的字符集来表示的。所以用户提交请求的时 

候就必须保证请求信息的编码方式是GBK,试想如果用户请求信息是utf8进行 

编码的,那么这些信息在之后显示给用户的时候可能就是乱码。 

request对象是javax.servlet.ServletRequest的-。 个实例,request的 

setCharacterEneoding方法就可以指定用户请求信息的编码方式。代码如 

下:<%request.setCharacterEncoding( GBK ):%>将页面请求信息的编码方 

式指定为GBK。此方法有效的前提是form的使用的提交方式为post,如果使 

用get方法进行传递则无效,那样的话只能编写一段代码进行人工的编码方式 

转换。 

2.3 response对象中的setcontentType方法 

用户提交给我们的信息已经设置了编码方式,服务器端生成的动态网页也 

指定了编码方式,这样一般情况下是不会出现中文乱码的。但是我们仍然不 

能掉以轻心,所以还需要对发送给用户的信息指定编码方式。同样是jsP内 

置对象的response对象,用于动态响应客户端请示,控制发送给用户的信息, 

并将动态生成响应。这个隐藏对象提供了一个setc0ntentType方法,我们可 

以通过在控制跳转的Action对象中加入语句re sportse.setContentType 

( text/html:eharset=GBK ),这样就可以将发送给用户信息的编码方式指定 

为GBK。 

2 4指定数据库的编码方式 

大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间 

的乱码问题比较明智的方式是使用unieode编码与数据库交互。很多数据库 

驱动自动支持unieode,如Microsoft的SQLServer驱动。其他大部分数据库 

驱动,可以在驱动的url参数中指定。我们在对数据显示的编码方式和用户 

传递给服务器的请求信息的编码方式进行指定后,对于数据库中的信息编码方 

式也不能掉以轻心。例如,数据库系统MySQL5.0,该数据库的默认编码方式 

是IS08859—1(1atin—I),这是一种西欧字符的编码方式。如不进行配置中文 

字符就会都显示成“?”。配置的方法相对简单,如果还没有安装MySQL那 

么可以在安装的过程中将Default character set设置为GBK(默认值是 

latin一1):如果你已经安装了MySQL,在安 ̄MySQL后在安装路径下找E1

一n 地一.  、一~ 一~ ~ 一 D㈨一  Ⅲ一~一蚕 一 一~~一 一一~ 妇。 ~ 一~ 一㈨ ~一

 

my.ini

一~m ~

 

文件,在文件中搜索字符串default character set=fatinl,将fatinl改为 

GBK就可以了,一共需要改两处。如果你的数据库已经存在,那么就需要到数 

据库目录下找到db.opt文件,然后将其defauIt character set的值设为 

GBK。 

2.5使用过滤器fi Iter 

一m

过滤器的作用是将用户的请求信息的编码进行转换,可以说是中文乱码防 

范的最后一道防线。之前讨论的几种方法看似已经完全可以应付中文乱码问 

题,但是在开发系统的过程中,发现并非如此。使用过滤器可以说是对付中文 

乱码问题最有效的方法,但是实现起来就不再像之前讨论的几种方法那么容 

易。首先需要编写过滤器程序,然后还需要配置web.xm1文件 

首先谈谈如何开发这个fiiter类,实现这个过滤器类需要继承类javax. 

servlet.http.HttpServlet。并实现javax.seI’vlet.Fiiter接口。继承 

HttpServlet类的目的是为了使过滤器可以接收到用户请求,实现n1ter接口 

是为了起到过滤的作用。有三个方法是必须实现的,i nit(Fj1t erConfig 

filterConfig)用来对过滤器进行初始化相关的配置工作:destroy0方法用来 

回收资源,JAVA语言本身的JVM(JAVA virtual machine)具有此类功能,所以 

在此函数中只需要把不需要使用的资源的引用赋值为null就可以:doFiiter 

(serv1 tRequest request, serv1etResponse response, Fi IterChain chain) 

方法进行实际的过滤工作,至少要包含两条语句:r e q u e s t. 

8etcharacterEncoding ‘GBK’ 年口chain.doFiIter(request, response), 

setCharacterEncoding负责对请求信息进行编码,chain.doFilter(request, 

response)负责告诉WEB容器调用另一个过滤器列表中的下一个过滤器,因为 

个系统可能有多个过滤器。 

实现代码: 

package actionkndForm 

import javax.servlet. : 

import javax.servlet.http. 

import java.io. : 

import java.util. : 

pub1ic class EncodingServlet 

extends HttpServlet implements Filter{ 

protected String encoding=i]131l: 

protected boolean ignore=true: 

private FiiterConfig fi1terConfig: 

//Handle the passed—in Fi1terConl g 

132 l科技博览 

~一洲∞  ~一蜘m 一~ 

//回收资源 

publ

一~

 

 

ic void destroy 

thi 

一.

s.encoding:nul1:

 

0{ 

 

this filterConfig=nul1 

下面谈谈如何配置web.xml文件,首先定义一个fiiter元素,并将其予元 

素fiiter~name、filter class、init-param进行配置,作用是声明fiiter 

名字、指定实际实现此fi l ter的具体类、声明变量来保存编码具体信息。 

下一步需要对这个filter进行映射,即声明哪些用户请求需要被过滤,此处我 

们声明为所有用户请求。具体实现的代码部分如下: 

<fi lter> 

<filter~name>encodingservlet</fi1ter—name> 

<fi1ter class>actionAndForm.Enc0dingServ1et</filter— 

c1ass> 

<init param> 

<description>encode to GBK</description> 

<param-name>encoding</param—name> 

<param value>GBK</param-value> 

< init—param> 

</fi】ter> 

<fi1ter mapping> 

<filter~name>encodingservlet</fiIter—name> 

<url pattern>/*</url—pattern> 

(/fi iter—mapping> 

参考文献 、 

[1]百度百科,CodePage,http:llbaike.baidu.com/view/1428668.htm? 

fr=ala0 

[2]百度百科,Unicode,http://baike.baidu.c0Ⅲ/view/408O1.htm. 

 一让~. 


本文标签: 编码 信息 乱码 参数 进行