JAVA教程之java中文办理年夜全(下)
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。办理|中文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(newInputStreamReader(System.in,"gb2312"));//设置输出接口按中文编码
BufferedWriterstdout=newBufferedWriter(newOutputStreamWriter(System.out,"gb2312"));//设置输入接口按中文编码
stdout.write("请输出:");
stdout.flush();
strin=stdin.readLine();
stdout.write("这是从用户输出的串:"+strin);
stdout.write(str);
stdout.flush();
}}
同时,在编译程序时,我们用以下体例来举行:
javac-encodinggb2312Read.java
其运转了局如所示:
<br>
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.*;
publicclassHelloWorldextendsHttpServlet
{
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>
其运转了局如所示:
<br>
4、JAVA程序和数据库之间
为制止JAVA程序和数据库之间数据传送呈现乱码征象,我们倡议接纳以下最优办法来处置:
1、关于JAVA程序的处置办法按我们指定的办法处置。
2、把数据库默许撑持的编码格局改成GBK或GB2312的。
如:在mysql中,我们能够在设置文件my.ini中到场以下语句完成:
在区增添:
default-character-set=gbk
并增添:
default-character-set=gbk
在SQLServer2K中,我们能够将数据库默许的言语设置为SimplifiedChinese来到达目标。
5、针对JSP代码
因为JSP是在运转时,由WEB容器举行静态编译的,假如我们没有指定JSP源文件的编码格局,则JSP编译器会取得服务器操纵体系的file.encoding值来对JSP文件编译的,它在移植时最简单出成绩,如在中文win2k中能够很好运转的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>
如是此程序运转的了局表示图:
<br>
5、总结
在下面的具体剖析中,我们明晰地给出了JAVA在处置源程序过程当中的具体转换历程,为我们准确办理JAVA编程中的中文成绩供应了基本。同时,我们给出了以为是最优的办理JAVA中文成绩的举措。
6、参考材料
1、段明辉.Java编程手艺中汉字成绩的剖析及办理.
http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml
2、周竞涛.关于Java中文成绩的几条剖析准绳
http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,netBeans等等,但是我认为如果java想超越.net,那么他首先要解决的就是IDE工具的整合。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java 编程语言的风格十分接近C、C++语言。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
页:
[1]