|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再说说缺点:首先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
其运转了局如所示:
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>
其运转了局如所示:
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文件编译的,它在移植时最简单出成绩,如在中文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>
如是此程序运转的了局表示图:
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工具的整合。 |
|