admin 管理员组

文章数量: 1184232


2024年3月12日发(作者:c语言环境配置)

维普资讯

第21卷第6期 

甘肃联合大学学报(自然科学版) 

VoI.2l No.6 

2007年l1月 

Journal of Gansu Lianhe University(Natural Sciences) 

NOV.2007 

文章编号:1672—691X(2007)06-0075—03 

J SP中文乱码问题分析及处理方法 

李国禄 。 

(1.大连理工大学电子与信息工程学院,辽宁大连l16024;2.青海民族学院电子工程与信息科学系,青海西宁810007) 

摘要:剖析了Java语言处理中文时出现乱码现象的原因,并给出了几种方案来解决JSP中的中文显示乱码 

问题. 

关键词:JSP;Unicode:JDK;中文乱码 

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

1 问题的提出 

(3)客户端读取服务器端的输出和服务器端 

读客户端的输人:Servlet需要将HTML页面内 

Java语言在内部采用Unicode表示字符, 

容转换为browser可接受的encoding(用con— 

Unicode是用两个字节表示一个字符的字符编 tent-type指定)内容发送出去.在目前的Servlet 

码.而我们通常使用的字符编码如GB2312, 

的规范中,如果不指定的话,通过Web提交时输 

GBK,BIG5,GB18030—2000等都是双字节字符 

人的ServletRequest和输出时的ServletRe— 

集,与Unicode的编码机制有很大差别.以简体中 

sponse缺省都是以ISO8859—1进行编码/解码 

文为例,每个ASCII字符的长度只占一个字节; 

的.因此,即使服务器操作系统的语言环境是中 

每个汉字字符占两个字节,以GB内码表示,这两 文,上面输人的请求仍然按英文解码成8个Uni— 

个字节均大于0xA0,表示汉字所在的区和位.例 code字符,输出时仍按照英文再编码成8个字 

如“汉字问题”这四个字对应的GB内码是: 

节,虽然这样在浏览器端如果设置是中文能够正 

BABA,D7D6.CECA,CCE2.同样是一个汉字占 

确显示,但实际上读写的是“字节”. 

两个字节,GB内码不但与Unicode码完全不同, 

如果其中任何一步出错,则显示出来的汉字 

而且也没有对应的转换规律. 

就会出现乱码,因此Java中文问题产生的原因就 

因此如果不指明用什么编码方式,Java只好 是字符集的不统一.Java语言的中文处理问题可 

按照默认的方式进行工作了.Java程序运行时, 

以归结为:如何将GB编码的字节串转换为正确 

从Unicode编码和对应的操作系统及浏览器的编 的Unicode字符串. 

码格式转换输人、输出.这个转化过程有着一系列 

的如下步骤: 

2解决方法 

(1)JSP编译:Java应用服务器将根据JVM 方法1:在JSP文件中都显示进行代码转换 

的file。coding值读取JSp源文件,编译生成Java 

在JSp程序中加人如下语句: 

源文件..再根据me.encpding值写匾文件系.统。 

<%@page conten,LType一..i ̄..text/html; 

(2)Java源文件被编译为class文件:这个过 

charset—gb2312”%>可以保证正确显示中文字 

程与一般的程序编译成class文件相同。从这里开 符.例如: 

始Servlet和JSP的行就类似了,只不过Servlet 

< @page contentType一“text/html; 

的编译不是自动进行的。对JSp程序,对产生的 

charset—gb2312”%> 

Java中间文件的编译是自动进行的,在程序中直 

<html> 

接调用sun、tools、Javac、Main类. 

<head> 

收稿日期:2007—10—08. 

作者简介:李国禄(1974一),男(土族),青海大通人,青海民族学院讲师,大连理工大学硕士研究生,主要从事计算机 

应用研究. 

维普资讯

76 甘肃联合大学学报(自然科学版) 第2l卷 

<title>第一个JSP页面title> 

</head> 

<body> 

<br> 

< out.println(“这是一个简单的JSP 

页面”); > 

</body> 

</html> 

方法2:利用TOMCAT5的配置文件WEB. 

XML解决中文问题在T0MCAT5的WEB. 

XML文件中设置的参数可以对整个站点起作用, 

因此我们在WEB.XML中设置一个filters标签, 

在这个Filters中利用SetCharacterEncodingFil— 

ter类来处理字符集,同时将这个类中参数enco— 

ding设置为GBK.在web.xml里加入如下几行: 

<filter> 

<filter--name>Set Character Encoding</ 

filter—name> 

<filter~class>filters.SetCharacterEncod— 

ingFiher</fiher--class> 

<init—param> 

<param‘——name>encoding</param —— 

name> 

<param‘——value>GBK</param‘——val—- 

ue> 

</init—param> 

</filter> 

<filter--mapping> 

<filter—name>Set Character Enco— 

ding</fiher--name> 

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

</filter—mapping> 

把SetCharacterEncoding Filter类上文件编 

译为setCharacterEncodingFilter.class文件并存 

放在你的虚拟目录下的WEB—INF\classes\filters 

\目录下,如果没有filters目录,就创建一个.经过 

以上设置后,重启TOMCAT,基本上可以解决 

JSP中文乱码问题. 

方法3:解决问题的根源在于能对GB码字节 

串和Unicode码字符串进行相互转换.在 

JDK1.0以上版本中,String类本身提供了转换功 

能,例如: 

String string a一“汉字问题中文兼容性”; 

byte[]gbbyte—string a.getBytes 

(“GB2312”);∥Unicode-- ̄GB 

String string b—new String(gbbyte, 

GB23 1 2 、) GB-- ̄Unicode 

System.out.println(string b): 

经过转换string b与string a内容完全一样. 

实际编程时可以写成如下转换函数: 

public String codeToString(String str) 

{String s—str; 

try 

{ 

byte tempB[]一S.getBytes(“ISO一8859— 

1"); 

s—new String(tempB): 

return S; 

) 

catch(Exception e) 

{ 

return S; 

) 

) 

其中getBytes( )方法中的参数是要转换的 

编码.例如: 

< @page contentType:“text/html; 

charset=gb2312” > 

<%! 

public String codeToString(String str) 

{//处理中文字符串的函数 

String s—str: 

try 

{ 

byte tempB[-]一S.getBytes(“IsO一8859 

1”): 

s—new String(tempB) 

return S; 

) 

catch(Exception e) 

{ 

return S; 

) 

) 

%> 

<html> 

<body> 

<form name=“form1”action一“chinese— 

维普资讯

第6期 李国禄:JSP中文乱码问题分析及处理方法 77 

StringExample1.jsp”method=“post”> 

是对于Java程序的处理方法按我们指定的方 

请输入您的姓名: 

<input type=“text’’name “username”> 

<input type一“submit”name一“submit” 

法处理;二是把数据库默认支持的编码格式改为 

GBK或GB2312.如在SQL Server2K中,可以将 

数据库默认的语言设置为Simplified Chinese来 

达到目的. value=“提交”> 

</form ̄<br> 

< 

3 结论 

经过对Java程序转换过程的分析,知道乱码 

现象存在的根本原因是含有中文字符的字符串 

(其编码格式为GBK或者GB2312)被当作别的 

编码格式编码或者解码了.文中给出的方法在操 

作系统为Windows Server2000,数据库为SQL 

Server2000,WEB服务器为T0MCAT 5.0的环 

if(request.getParameter(“username”): 

==nul1) 

out.println(“您没有输入姓名.”); 

else 

out.println(你输入的姓名为:+codeToS- 

tring(request.getParameter(“username”))); 

> 

境下测试成功.能有效的解决JSP中的中文显示 

乱码的问题. 

参考文献: 

[1]程凯、JsP中文问题及一套整体解决方案[J].许昌学 

院学报,2006,25(5):77—80. 

</body ̄ 

</html> 

程序能正确显示输入的汉字. 

方法4:读取数据库中文问题及解决方法. 

对于几乎所有数据库的JDBC驱动程序,默 

认的在Java程序和数据库之间传递数据都是以 

1SO一8859—1为默认编码格式的,所以,程序在 

[2]余海燕,郑笑飞.Java语言的中文处理问题完整解决 

方案[J].中文信息学报,2000,1,t(5):57—63. 

[3]王子君.范学蜂,张志浩.Java编码问题研究与应用 

[j].计算机工程,2002,28(3):242—245. 

向数据库内存储包含中文的数据时,JDBC首先 

是把程序内部的Unicode编码格式的数据转化为 

1S0—8859—1的格式,然后传递到数据库中,在 

[4]JOHNLHR.Java处理中文化问题详解[EB/OL].ht— 

tp://www.globebbs.com/hhs/showthread.php. 

2005—01-03. 

数据库保存数据时,它默认即以1S0—8859—1 

保存,所以,这是为什么常常在数据库中读出的中 

文数据是乱码.为避免Java程序和数据库之间数 

据传递出现乱码现象,可用以下最优方法来处理: 

[5]刘长生,谢强,丁秋林.Java应用中的汉字乱码问题分 

析[j].计算机技术与发展,2006,16(1);158—161. 

Analysis on Chinese Encoding in JSP and Its Solution 

LJ G o—lu 

(1.School of Information and Electronic Engineering,Dalian University of Technology,Dalian 116024,China; 

2.Department of Electronic Engineering and Information Science,Qinhai University for Nationalities,Xining 810007,China) 

Abstract:This article analyzes the cause for encoding in the solution for Java,and puts forward the dif— 

ferent methods to solve Chinese encoding in JSP. 

Key words:JSP;Unicode;jdk;Chinese encoding 


本文标签: 问题 编码 处理 乱码 方法