|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。js|办理|成绩|中文====================http://www.glgg.net/blog===================zsjnju@hotmail.com================开辟java使用呈现乱码是很罕见的,究竟如今unicode的利用还不是很普遍,在利用gb2312(包括了gbk简体,big5繁体)的体系中要准确完成中文的display和数据库的存储是最基础的请求。========================http://www.glgg.net/blog=======================================1,起首developer要明白本人为何会碰到乱码,碰到甚么样的乱码(偶然义的标记仍是一串问号大概别的甚么工具)。老手碰到一堆很乱的字符时一般手足无措,最间接的反应就是翻开google搜刮”java中文”(这个字符串在搜刮引擎上的查询频次十分高),然后一个一个的往看他人的办理办法。如许做没有错,可是很难到达目标,缘故原由上面会提到。总之,呈现乱码的缘故原由长短常多的,办理的办法也完整纷歧样,要办理
====================http://www.babatu.com===================babatu@gmail.com================
开辟java使用呈现乱码是很罕见的,究竟如今unicode的利用还不是很普遍,在利用gb2312(包括了gbk简体,big5繁体)的体系中要准确完成
中文的display和数据库的存储是最基础的请求。
========================http://www.babatu.com=======================================
1,起首developer要明白本人为何会碰到乱码,碰到甚么样的乱码(偶然义的标记仍是一串问号大概别的甚么工具)。
老手碰到一堆很乱的字符时一般手足无措,最间接的反应就是翻开google搜刮”java中文”(这个字符串在搜刮引擎上的查询频次十分高),
然后一个一个的往看他人的办理办法。如许做没有错,可是很难到达目标,缘故原由上面会提到。
总之,呈现乱码的缘故原由长短常多的,办理的办法也完整纷歧样,要办理成绩必需先剖析本人的”高低文情况”。
========================http://www.babatu.com=====================================
2,详细说来,必要哪些信息才干断定项目中的乱码的本源。
a,开辟者所用的操纵体系
b,j2ee容器的称号,版本
c,数据库的称号,版本(准确版本)和jdbc驱动的版本
d,呈现乱码的sourcecode(好比是systemout出来的,仍是jsp页面中的,假如是jsp中的,那末头部声明的情形也很主要)
=========================http://www.glgg.net/blog========================================
3,怎样开端剖析乱码呈现的缘故原由。
有了上述的信息,基础上就能够发帖乞助了,信任放到javaworld等论坛上,很快就会有妙手给你提出无效的办理计划的。
固然不克不及总靠发帖乞助,也要尝尝自行办理成绩。怎样动手呢?
a,剖析一下你的”乱码”究竟是甚么编码。这个实在不难,好比
System.out.println(testString);
这一段呈现了乱码,那末无妨用穷举法推测一下它的实践编码格局。
System.out.println(newString(testString.getBytes(”ISO-8859-1″),”gb2312″));
System.out.println(newString(testString.getBytes(”UTF8″),”gb2312″));
System.out.println(newString(testString.getBytes(”GB2312″),”gb2312″));
System.out.println(newString(testString.getBytes(”GBK”),”gb2312″));
System.out.println(newString(testString.getBytes(”BIG5″),”gb2312″));
等等,上述代码的意义是用制订的编码格局往读取testString这个”乱码”,并转换成gb2312(此处仅以中文为例)
然后你看哪个转换出来的了局是ok的,那就。。。
b,假如用下面的步骤能失掉准确的中文,申明你的数据一定是在的,只不外是界面中没有准确显现罢了。那末第二步就该改正你的view部分了
,一般必要反省的是jsp中是不是选择了准确的页面编码。
在此要声明被良多人曲解的一点,那就是<%@pagecontentType=”text/html;charset=GB2312″%>指令和<METAhttp-equiv=Content-Type
content=”text/html;charset=gb2312″>二者的分歧。一般网上的良多文章在提到中文成绩时都是说数据库当选择unicode大概gb2312存储,同
时在jsp顶用page指令声明编码就能够办理。可是我以为这类说法很不卖力任,害的我费了N多工夫为原本其实不存在的乱码而忧郁。实践上page
的感化是在jsp被编译成为html的过程当中供应编码体例让java来”读取”表达式傍边的String(有点相似于下面的第三个语句的感化),而meta
的感化是尽人皆知的为IE扫瞄器供应编码选择,是用来”显现”最初的数据的。可是没有看到有人提示这一点,我一向把page当做meta在用,
招致原本是iso-8859的数据,被page指令读成gb2312,因而乱码,以是又加了编码转化的函数把一切的string数据都从iso8859转到gb2312(为
甚么这么转,事先也没思索这么多,由于这么做能够一般显现了,以是就这么改了,呵呵事先其实没偶然间渐渐排查询题了)。
===========================http://www.glgg.net/blog==========================================
4,数据库选择甚么样的编码对照好。
今朝盛行的DB次要有sqlserver,mysql,oracle,DB2等,个中mysql作为收费DB中的老迈,功能和功效是失掉公认的,安拆卸置对照便利,相
应的driver也对照完美,性价比是相对的OK。以是就以mysql为例。
我团体倡议接纳mysql的默许编码来存储,也就是iso-8859-1(在mysql的选项中对应于latin-1)。来由次要有这么几个,一是iso-8859-1对中
文的撑持不错;二是跟java中的默许编码分歧,最少在良多中央免去了转换编码的贫苦;三是默许的对照不乱,兼容性也更好,由于多编码的
撑持是由详细的DB产物供应的,别说跟别的的DB会不兼容,即便本身的分歧版本也大概呈现兼容性的成绩。
比方mysql4.0之前的产物中,良多中文的办理计划是使用connection中的characterEncoding字段来制订编码,好比gb2312甚么的,如许是ok
的,由于原数据都是ISO8859_1编码,jdbc驱动会接纳url内里指定的characterset来举行编码,resultSet.getString(*)掏出的就是编码后的
字符串。如许就间接拿到gb2312的数据了。
可是mysql4.1的推出给良多dbadmin带来了不小的贫苦,由于mysql4.1撑持columnlevel的characterset,每一个table,column都能够指定编码
,不指定就是ISO8895_1,因而jdbc掏出数据后会依据column的characterset来举行编码,而不再是用一个全局的参数来取一切的数据了。
这从另外一个方面也申明了乱码成绩的发生其实是很庞大的事变,缘故原由太多了。我也只是针对本人碰到的实践情形供应一些办理思绪,有甚么错
误的中央请email至zsjnju@hotmail.com.但愿能更多的看抵达人本人的文章,而不是一堆耳食之言的拷贝。
InternelUseOnly.
AnyQuestion,pleasereffertozsjnju@hotmail.com
================================http://www.glgg.net/blog======================================
终究找到最完善的办理中文成绩的计划了。。。感谢网上的这个文章的作者。。。
我的原文是依据本人的履历总结出来的。固然没甚么毛病,可是一直没有找到终极的病根。看了这个文章以后,入手下手名顿开,哈哈,
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――-
因为Java编程中的中文成绩是一个陈词滥调的成绩,在浏览了很多关于Java中文成绩办理办法以后,分离作者的编程理论,我发明已往谈的很多办法都不克不及明晰地申明成绩及办理成绩,特别是跨平台时的中文成绩。
因而我给出此篇文章,内容包含对把持台运转的class、Servelets、JSP及EJB类中的中文成绩我分析和倡议办理举措。但愿人人指教。
Abstract:本文深切剖析了Java程序计划中Java编译器对Java源文件和JVM对class类文件的编码/解码历程,经由过程此历程的剖析透视出了Java编程中中文成绩发生的基本缘故原由,最初给出了倡议的最优化的办理Java中文成绩的办法。
1、中文成绩的来历
盘算机最后的操纵体系撑持的编码是单字节的字符编码,因而,在盘算机中统统处置程序最后都是以单字节编码的英文为准举行处置。
跟着盘算机的开展,为了顺应天下别的平易近族的言语(固然包含我们的汉字),人们提出了UNICODE编码,它接纳双字节编码,兼容英笔墨符和别的平易近族的双字节字符编码,以是,今朝,年夜多半国际性的软件外部均接纳UNICODE编码,在软件运转时,它取得当地撑持体系(多半工夫是操纵体系)默许撑持的编码格局,然后再将软件外部的UNICODE转化为当地体系默许撑持的格局显现出来。
Java的JDK和JVM便是云云,我这里说的JDK是指国际版的JDK,我们年夜多半程序员利用的是国际化的JDK版本,以下一切的JDK均指国际化的JDK版本。我们的汉字是双字节编码言语,为了能让盘算机处置中文,我们本人制订的gb2312、GBK、GBK2K等尺度以顺应盘算机处置的需求。
以是,年夜部分的操纵体系为了顺应我们处置中文的需求,均定制有中文操纵体系,它们接纳的是GBK,GB2312编码格局以准确显现我们的汉字。如:中文Windows默许接纳的是GBK编码显现,在中文Windows2000中保留文件时默许接纳的保留文件的编码格局也是GBK的,即一切在中文Windows2000中保留的文件它的外部编码默许均接纳GBK编码,注重:GBK是在GB2312基本上扩大来的。
因为Java言语外部接纳UNICODE编码,以是在Java程序运转时,就存在着一个从UNICODE编码和对应的操纵体系及扫瞄器撑持的编码格局转换输出、输入的成绩,这个转换历程有着一系列的步骤,假如个中任何一步堕落,则显现出来的汉字就会出是乱码,这就是我们罕见的Java中文成绩。
同时,Java是一个跨平台的编程言语,也即我们编写的程序不但能在中文windows上运转,也能在中文Linux等体系上运转,同时也请求能在英文等体系上运转(我们常常看到有人把在中文Windows2000上编写的Java程序,移植到英文Linux上运转)。这类移植操纵也会带来中文成绩。
另有,有人利用英文的操纵体系和英文的IE等扫瞄器,来运转带中笔墨符的程序和扫瞄中文网页,它们自己就不撑持中文,也会带来中文成绩。
几近一切的扫瞄器默许在传送参数时都是以UTF-8编码格局来传送,而不是按中文编码传送,以是,传送中文参数时也会有成绩,从而带来乱码征象。
总之,以上几个方面是Java中的中文成绩的次要来历,我们把以上缘故原由酿成的程序不克不及准确运转而发生的成绩称作:Java中文成绩。
2、Java编码转换的具体历程
我们罕见的Java程序包含以下种别:
*间接在console上运转的类(包含可视化界面的类)
*JSP代码类(注:JSP是Servlets类的变型)
*Servelets类
*EJB类
*别的不成以间接运转的撑持类
这些类文件中,都有大概含有中笔墨符串,而且我们经常使用前三类Java程序和用户间接交互,用于输入和输出字符,如:我们在JSP和Servlet中失掉客户端送来的字符,这些字符也包含中笔墨符。不管这些Java类的感化怎样,这些Java程序的性命周期都是如许的:
*编程职员在必定的操纵体系上选择一个符合的编纂软件来完成源程序代码并以.Java扩大名保留在操纵体系中,比方我们在中文Windows2000顶用记事本编纂一个Java源程序。
*编程职员用JDK中的Javac.exe来编译这些源代码,构成.class类(JSP文件是由容器挪用JDK来编译的)。
*间接运转这些类或将这些类布署到WEB容器中往运转,并输入了局。
那末,在这些过程当中,JDK和JVM是怎样将这些文件怎样编码息争码并运转的呢?
这里,我们以中文Windows2000操纵体系为例申明Java类是怎样来编码和被解码的。
第一步,我们在中文Windows2000顶用编纂软件如记事本编写一个Java源程叙文件(包含以上五类Java程序),程叙文件在保留时默许接纳了操纵体系默许撑持GBK编码格局(操纵体系默许撑持的格局为file.encoding格局)构成了一个.Java文件,也即,Java程序在被编译前,我们的Java源程叙文件是接纳操纵体系默许撑持的file.encoding编码格局保留的,Java源程序中含有中文信息字符和英文程序代码;要检察体系的file.encoding参数,能够用以下代码:
publicclassShowSystemDefaultEncoding
{
publicstaticvoidmain(String[]args)
{
Stringencoding=
System.getProperty(”file.encoding”);
System.out.println(encoding);
}
}
第二步,我们用JDK的Javac.exe文件编译我们的Java源程序,因为JDK是国际版的,在编译的时分,假如我们没有效-encoding参数指定我们的Java源程序的编码格局,则Javac.exe起首取得我们操纵体系默许接纳的编码格局,也即在编译Java程序时,若我们不指定源程叙文件的编码格局,JDK起首取得操纵体系的file.encoding参数(它保留的就是操纵体系默许的编码格局,如Windows2000,它的值为GBK),然后JDK就把我们的Java源程序从file.encoding编码格局转化为Java外部默许的UNICODE格局放进内存中。
然后,Javac把转换后的unicode格局的文件举行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保留到我们的操纵体系中构成我们见到的.class文件。
对我们来讲,我们终极取得的.class文件是内容以UNICODE编码格局保留的类文件,它外部包括我们源程序中的中笔墨符串,只不外此时它己经过file.encoding格局转化为UNICODE格局了。
这一步中,关于JSP源程叙文件是分歧的,关于JSP,这个历程是如许的:即WEB容器挪用JSP编译器,JSP编译器先检察JSP文件中是不是设置有文件编码格局,假如JSP文件中没有设置JSP文件的编码格局,则JSP编译器挪用JDK先把JSP文件用JVM默许的字符编码格局(也即WEB容器地点的操纵体系的默许的file.encoding)转化为一时的Servlet类,然后再把它编译成UNICODE格局的class类,并保留在一时文件夹中。
如:在中文Windows2000上,WEB容器就把JSP文件从GBK编码格局转化为UNICODE格局,然后编译成一时保留的Servlet类,以呼应用户的哀求。
第三步,运转第二步编译出来的类,分为三种情形:
A、间接在console上运转的类
B、EJB类和不成以间接运转的撑持类(如JavaBean类)
C、JSP代码和Servlet类
D、Java程序和数据库之间
上面我们分这四种情形来看。
A、间接在console上运转的类
这类情形,运转该类起首必要JVM撑持,即操纵体系中必需安装有JRE。运转历程是如许的:起首Java启动JVM,此时JVM读出操纵体系中保留的class文件并把内容读进内存中,此时内存中为UNICODE格局的class类,然后JVM运转它,假如此时此类必要吸收用户输出,则类会默许用file.encoding编码格局对用户输出的串举行编码并转化为unicode保留进内存(用户能够设置输出流的编码格局)。
程序运转后,发生的字符串(UNICODE编码的)再回交给JVM,最初JRE把此字符串再转化为file.encoding格局(用户能够设置输入流的编码格局)传送给操纵体系显现接口并输入到界面上。以上每步的转化都必要准确的编码格局转化,才干终极不呈现乱码征象。B、EJB类和不成以间接运转的撑持类(如JavaBean类)
因为EJB类和不成以间接运转的撑持类,它们一样平常不与用户间接交互输出和输入,它们经常与别的的类举行交互输出和输入,以是它们在第二步被编译后,就构成了内容是UNICODE编码的类保留在操纵体系中了,今后只需它与别的的类之间的交互在参数传送过程当中没有丧失,则它就会准确的运转。
C、JSP代码和Servlet类
经由第二步后,JSP文件也被转化为Servlets类文件,只不外它不像尺度的Servlets一校存在于classes目次中,它存在于WEB容器的一时目次中,故这一步中我们也把它做为Servlets来看。
关于Servlets,客户端哀求它时,WEB容器挪用它的JVM来运转Servlet,起首,JVM把Servlet的class类从体系中读出并装进内存中,内存中是以UNICODE编码的Servlet类的代码,然后JVM在内存中运转该Servlet类,假如Servlet在运转的过程当中,必要承受从客户端传来的字符如:表单输出的值和URL中传进的值,此时假如程序中没有设定承受参数时接纳的编码格局,则WEB容器会默许接纳ISO-8859-1编码格局来承受传进的值并在JVM直达化为UNICODE格局的保留在WEB容器的内存中。
Servlet运转后天生输入,输入的字符串是UNICODE格局的,紧接着,容器将Servlet运转发生的UNICODE格局的串(如html语法,用户输入的串等)间接发送到客户端扫瞄器上并输入给用户,假如此时指定了发送时输入的编码格局,则按指定的编码格局输入到扫瞄器上,假如没有指定,则默许按ISO-8859-1编码发送到客户的扫瞄器上。
D、Java程序和数据库之间
关于几近一切数据库的JDBC驱动程序,默许的在Java程序和数据库之间传送数据都是以ISO-8859-1为默许编码格局的,以是,我们的程序在向数据库内存储包括中文的数据时,JDBC起首是把程序外部的UNICODE编码格局的数据转化为ISO-8859-1的格局,然后传送到数据库中,在数据库保留数据时,它默许即以ISO-8859-1保留,以是,这是为何我们经常在数据库中读出的中文数据是乱码。
3、剖析罕见的Java中文成绩几个必需分明的准绳
起首,经由下面的具体剖析,我们能够明晰地看到,任何Java程序的性命期中,其编码转换的关头历程是在于:最后编译成class文件的转码和终极向用户输入的转码历程。
其次,我们必需懂得Java在编译时撑持的、经常使用的编码格局有以下几种:
*ISO-8859-1,8-bit,同8859_1,ISO-8859-1,ISO_8859_1等编码
*Cp1252,美国英语编码,同ANSI尺度编码
*UTF-8,同unicode编码
*GB2312,同gb2312-80,gb2312-1980等编码
*GBK,同MS936,它是gb2312的扩大及别的的编码,如韩文、日文、繁体中文等。同时,我们要注重这些编码间的兼容关系统以下:
unicode和UTF-8编码是逐一对应的干系。GB2312能够以为是GBK的子集,即GBK编码是在gb2312上扩大来的。同时,GBK编码包括了20902个汉字,编码局限为:0×8140-0xfefe,一切的字符能够逐一对应到UNICODE2.0中来。
再次,关于放在操纵体系中的.Java源程叙文件,在编译时,我们能够指定它内容的编码格局,详细来讲用-encoding来指定。注重:假如源程序中含有中笔墨符,而你用-encoding指定为别的的编码字符,明显是要堕落的。
用-encoding指定源文件的编码体例为GBK或gb2312,不管我们在甚么体系上编译含有中笔墨符的Java源程序都不会有成绩,它城市准确地将中文转化为UNICODE存储在class文件中。
然后,我们必需分明,几近一切的WEB容器在其外部默许的字符编码格局都是以ISO-8859-1为默许值的,同时,几近一切的扫瞄器在传送参数时都是默许以UTF-8的体例来传送参数的。
以是,固然我们的Java源文件在收支口的中央指定了准确的编码体例,但其在容器外部运转时仍是以ISO-8859-1来处置的。
4、中文成绩的分类及其倡议最优办理举措
懂得以上Java处置文件的道理以后,我们就能够提出了一套倡议最优的办理汉字成绩的举措。我们的方针是:我们在中文体系中编纂的含有中笔墨符串或举行中文处置的Java源程序经编译后能够移值就任何别的的操纵体系中准确运转,或拿到别的操纵体系中编译后能准确运转,能准确地传送中文和英文参数,能准确地和数据库交换中英笔墨符串。我们的详细思绪是:在Java程序转码的出口和出口及Java程序同用户有输出输入转换的中央限定编码办法使之准确便可。
详细办理举措以下:
1、针对间接在console上运转的类
关于这类情形,我们倡议在程序编写时,假如必要从用户端吸收用户的大概含有中文的输出或含有中文的输入,程序中应当接纳字符流来处置输出和输入,详细来讲,使用以上面向字符型节点流范例:
对文件:FileReader,FileWrieter
其字节型节点流范例为:FileInputStream,FileOutputStream
对内存(数组):CharArrayReader,CharArrayWriter
其字节型节点流范例为:ByteArrayInputStream,ByteArrayOutputStream
对内存(字符串):StringReader,StringWriter
对管道:PipedReader,PipedWriter
其字节型节点流范例为:PipedInputStream,PipedOutputStream
同时,应当用以上面向字符型处置流来处置输出和输入:
BufferedWriter,BufferedReader
其字节型的处置流为:BufferedInputeStream,BufferedOutputStream
InputStreamReader,OutputStreamWriter
其字节型的处置流为:DataInputStream,DataOutputStream
个中InputStreamReader和InputStreamWriter用于将字撙节依照指定的字符编码集转换到字符流,如:
InputStreamReaderin=newInputStreamReader(System.in,”GB2312″);OutputStreamWriterout=newOutputStreamWriter(System.out,”GB2312″);比方:接纳以下的示例Java编码就到达了请求:
//Read.Java
importJava.io.*;
publicclassRead
{
publicstaticvoidmain(String[]args)
throwsIOException
{
Stringstr=
“
中文测试,这是外部硬编码的串
“+”
testenglishcharacter”;
Stringstrin=“”;
BufferedReaderstdin=
newBufferedReader(new
InputStreamReader(System.in,”gb2312″));
//设置输出接口按中文编码
BufferedWriterstdout=
newBufferedWriter(new
OutputStreamWriter(System.out,”gb2312″));
//设置输入接口按中文编码
stdout.write(”请输出:”);
stdout.flush();
strin=stdin.readLine();
stdout.write(”这是从用户输出的串:”+strin);
stdout.write(str);
stdout.flush();
}}
同时,在编译程序时,我们用以下体例来举行:
Javac-encodinggb2312Read.Java
2、针对EJB类和不成以间接运转的撑持类(如JavaBean类)
因为这类类它们自己被别的的类挪用,不间接与用户交互,故对这类类来讲,我们的倡议的处置体例是外部程序中应当接纳字符流来处置程序外部的中笔墨符串(详细如下面一节中一样),同时,在编译类时用-encodinggb2312参数唆使源文件是中文格局编码的便可。
3、针对Servlet类
针对Servlet,我们倡议用以下办法:
在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输入时的编码部分用response对象的setContentType(”text/html;charset=GBK”);或gb2312来设置输入编码格局,一样在吸收用户输出时,我们用request.setCharacterEncoding(”GB2312″);如许不管我们的servlet类移植到甚么操纵体系中,只要客户真个扫瞄器撑持中文显现,就能够准确显现。以下是一个准确的示例:
//HelloWorld.Java
packagehello;
importJava.io.*;
importJavax.servlet.*;
importJavax.servlet.http.*;
publicclassHelloWorld
extendsHttpServlet
{
publicvoidinit()
throwsServletException
{
}
publicvoiddoGet
(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsIOException,ServletException
{
request.setCharacterEncoding(”GB2312″);
//设置输出编码格局
response.setContentType
(”text/html;charset=GB2312″);
//设置输入编码格局
PrintWriterout=response.getWriter();
//倡议利用PrintWriter输入
out.println(”<hr>”);
out.println(”HelloWorld!
ThisiscreatedbyServlet!测试中文!”);
out.println(”<hr>”);
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsIOException,ServletException
{
request.setCharacterEncoding(”GB2312″);
//设置输出编码格局
response.setContentType
(”text/html;charset=GB2312″);
//设置输入编码格局
Stringname=request.getParameter(”name”);
Stringid=request.getParameter(”id”);
if(name==null)name=”";
if(id==null)id=”";
PrintWriterout=response.getWriter();
//倡议利用PrintWriter输入
out.println(”<hr>”);
out.println(”你传进的中笔墨串是:”+name);
out.println(”<hr>你输出的id是:”+id);
out.println(”<hr>”);
}
publicvoiddestroy()
{
}
}
请用Javac-encodinggb2312HelloWorld.Java来编译此程序。
测试此Servlet的程序以下所示:
<%@pagecontentType=”text/html;
charset=gb2312″%>
<%request.setCharacterEncoding(”GB2312″);%>
<html><head><title></title>
<Scriptlanguage=”JavaScript”>
functionSubmit()
{
//经由过程URL传送中笔墨符串值给Servlet
document.base.action=
“./HelloWorld?name=中文”;
document.base.method=“POST”;
document.base.submit();
}
</Script>
</head>
<bodybgcolor=”#FFFFFF”
text=”#000000″topmargin=”5″>
<formname=”base”method=
“POST”target=”_self”>
<inputname=”id”type=”text”
value=”"size=”30″>
<ahref=“JavaScript:Submit()”>
传给Servlet</a>
</form></body></html>
4、Java程序和数据库之间
为制止Java程序和数据库之间数据传送呈现乱码征象,我们倡议接纳以下最优办法来处置:
1、关于Java程序的处置办法按我们指定的办法处置。
2、把数据库默许撑持的编码格局改成GBK或GB2312的。
如:在mysql中,我们能够在设置文件my.ini中到场以下语句完成:
在[mysqld]区增添:
default-character-set=gbk
并增添:
[client]
default-character-set=gbk
在SQLServer2K中,我们能够将数据库默许的言语设置为SimplifiedChinese来到达目标。
5、针对JSP代码
因为JSP是在运转时,由WEB容器举行静态编译的,假如我们没有指定JSP源文件的编码格局,则JSP编译器会取得服务器操纵体系的file.encoding值来对JSP文件编译的,它在移植时最简单出成绩,如在中文Windows2000中能够很好运转的jsp文件拿到英文linux中就不可,只管客户端都是一样的,那是由于容器在编译JSP文件时猎取的操纵体系的编码分歧酿成的(在中文wink中的file.encoding和在英文Linux中file.encoding是分歧的,且英文Linux的file.encoding对中文不撑持,以是编译出来的JSP类就会有成绩)。
收集上会商的年夜多半是此类成绩,多是由于JSP文件移植平台时不克不及准确显现的成绩,关于这类成绩,我们懂得了Java中程序编码转换的道理,办理起来就简单多了。我们倡议的办理举措以下:
1、我们要包管JSP向客户端输入时是接纳中文编码体例输入的,即不管怎样我们起首在我们的JSP源代编中到场以下一行:
<%@pagecontentType=”text/html;
charset=gb2312″%>
2、为了让JSP能准确取得传进的参数,我们在JSP源文件头到场上面一句:
<%request.setCharacterEncoding(”GB2312″);
%>
3、为了让JSP编译器能准确地解码我们的含有中笔墨符的JSP文件,我们必要在JSP源文件中指定我们的JSP源文件的编码格局,详细来讲,我们在JSP源文件头上到场上面的一句便可:
<%@pagepageEncoding=”GB2312″%>
或<%@pagepageEncoding=”GBK”%>
这是JSP标准2.0新增添的指令。
我们倡议利用此办法来解JSP文件中的中文成绩,上面的代码是一个准确做法的JSP文件的测试程序:
//testchinese.jsp
<%@pagepageEncoding=”GB2312″%>
<%@pagecontentType=”text/html;
charset=gb2312″%>
<%request.setCharacterEncoding(”GB2312″);
%>
<%
Stringaction=request.getParameter(”ACTION”);
Stringname=“”;
Stringstr=“”;
if(action!=null&&action.equals(”SENT”))
{
name=request.getParameter(”name”);
str=request.getParameter(”str”);
}
%>
<html>
<head>
<title></title>
<Scriptlanguage=”JavaScript”>
functionSubmit()
{
document.base.action=
“?ACTION=SENT&str=传进的中文”;
document.base.method=“POST”;
document.base.submit();
}
</Script>
</head>
<bodybgcolor=”#FFFFFF”
text=”#000000″topmargin=”5″>
<formname=”base”method=
“POST”target=”_self”>
<inputtype=”text”name=”name”
value=”"size=”30″>
<ahref=“JavaScript:Submit()”>提交</a>
</form>
<%
if(action!=null&&action.equals(”SENT”))
{
out.println(”<br>你输出的字符为:”+name);
out.println(”<br>你经由过程URL传进的字符为:”+str);
}
%>
</body>
</html>
没有那个大公司会傻了吧唧用.net开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net不行,限制在window系统,又是捆绑,鄙视微软之! |
|