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用于将字节流按照指定的字符编码集转换到字符流,如:
InputStreamReader in = new InputStreamReader(System.in,"GB2312");
OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");
例如:采用如下的示例JAVA编码就达到了要求:
同时,在编译程序时,我们用以下方式来进行:
javac -encoding gb2312 Read.java
2、 针对EJB类和不可以直接运行的支持类(如JavaBean类)
由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。
3、 针对Servlet类
针对Servlet,我们建议用以下方法:
在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输出时的编码部分用response对象的setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式,同样在接收用户输入时,我们用request.setCharacterEncoding("GB2312");这样无论我们的servlet类移植到什么操作系统中,只有客户端的浏览器支持中文显示,就可以正确显示。如下是一个正确的示例:
请用javac -encoding gb2312 HelloWorld.java来编译此程序。
测试此Servlet的程序如下所示:
4、 JAVA程序和数据库之间
为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:
1、 对于JAVA程序的处理方法按我们指定的方法处理。
2、 把数据库默认支持的编码格式改为GBK或GB2312的。
如:在mysql中,我们可以在配置文件my.ini中加入以下语句实现:
在[mysqld]区增加:
default-character-set=gbk
并增加:
[client]
default-character-set=gbk
在SQL Server2K中,我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。
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源代编中加入以下一行:
<%@page contentType="text/html; charset=gb2312"%>
2、为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:
<%request.setCharacterEncoding("GB2312");%>
3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP源文件头上加入下面的一句即可:
<%@page pageEncoding="GB2312"%>或<%@page pageEncoding="GBK"%>
这是JSP规范2.0新增加的指令。
我们建议使用此方法来解JSP文件中的中文问题,下面的代码是一个正确做法的JSP文件的测试程序:
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
7、作者介绍
作者:柴政(abnerchai),1980年9月3日出生,高级程序员,西南交通大学计算机与通信工程学院计算机应用技术硕士研究生。研究方向为:网络安全,基于J2EE/EJB的中间件技术,项目管理/工作流等。作者联系方法:josserchai@yahoo.com 电话:028-87601939
[转自地址]http://tb.blog.csdn.net/TrackBack.aspx?PostId=18577
了解以上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用于将字节流按照指定的字符编码集转换到字符流,如:
InputStreamReader in = new InputStreamReader(System.in,"GB2312");
OutputStreamWriter out = new OutputStreamWriter (System.out,"GB2312");
例如:采用如下的示例JAVA编码就达到了要求:
//Read.java import java.io.*; public class Read { public static void main(String[] args) throws IOException { String str = "\n中文测试,这是内部硬编码的串"+"\ntest english character"; String strin= ""; BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in,"gb2312")); //设置输入接口按中文编码 BufferedWriter stdout = new BufferedWriter(new OutputStreamWriter(System.out,"gb2312")); //设置输出接口按中文编码 stdout.write("请输入:"); stdout.flush(); strin = stdin.readLine(); stdout.write("这是从用户输入的串:"+strin); stdout.write(str); stdout.flush(); }}
同时,在编译程序时,我们用以下方式来进行:
javac -encoding gb2312 Read.java
2、 针对EJB类和不可以直接运行的支持类(如JavaBean类)
由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。
3、 针对Servlet类
针对Servlet,我们建议用以下方法:
在编译Servlet类的源程序时,用-encoding指定编码为GBK或GB2312,且在向用户输出时的编码部分用response对象的setContentType("text/html;charset=GBK");或gb2312来设置输出编码格式,同样在接收用户输入时,我们用request.setCharacterEncoding("GB2312");这样无论我们的servlet类移植到什么操作系统中,只有客户端的浏览器支持中文显示,就可以正确显示。如下是一个正确的示例:
//HelloWorld.java package hello; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void init() throws ServletException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.setCharacterEncoding("GB2312"); //设置输入编码格式 response.setContentType("text/html;charset=GB2312"); //设置输出编码格式 PrintWriter out = response.getWriter(); //建议使用PrintWriter输出 out.println("<hr>"); out.println("Hello World! This is created by Servlet!测试中文!"); out.println("<hr>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { request.setCharacterEncoding("GB2312"); //设置输入编码格式 response.setContentType("text/html;charset=GB2312"); //设置输出编码格式 String name = request.getParameter("name"); String id = request.getParameter("id"); if(name==null) name=""; if(id==null) id=""; PrintWriter out = response.getWriter(); //建议使用PrintWriter输出 out.println("<hr>"); out.println("你传入的中文字串是:" + name); out.println("<hr>你输入的id是:" + id); out.println("<hr>"); } public void destroy() { } }
请用javac -encoding gb2312 HelloWorld.java来编译此程序。
测试此Servlet的程序如下所示:
<%@page contentType="text/html; charset=gb2312"%> <%request.setCharacterEncoding("GB2312");%> <html><head><title></title> <Script language="JavaScript"> function Submit() { //通过URL传递中文字符串值给Servlet document.base.action = "./HelloWorld?name=中文"; document.base.method = "POST"; document.base.submit(); } </Script> </head> <body bgcolor="#FFFFFF" text="#000000" topmargin="5"> <form name="base" method = "POST" target="_self"> <input name="id" type="text" value="" size="30"> <a href = "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
在SQL Server2K中,我们可以将数据库默认的语言设置为Simplified Chinese来达到目的。
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源代编中加入以下一行:
<%@page contentType="text/html; charset=gb2312"%>
2、为了让JSP能正确获得传入的参数,我们在JSP源文件头加入下面一句:
<%request.setCharacterEncoding("GB2312");%>
3、为了让JSP编译器能正确地解码我们的含有中文字符的JSP文件,我们需要在JSP源文件中指定我们的JSP源文件的编码格式,具体来说,我们在JSP源文件头上加入下面的一句即可:
<%@page pageEncoding="GB2312"%>或<%@page pageEncoding="GBK"%>
这是JSP规范2.0新增加的指令。
我们建议使用此方法来解JSP文件中的中文问题,下面的代码是一个正确做法的JSP文件的测试程序:
//testchinese.jsp <%@page pageEncoding="GB2312"%> <%@page contentType="text/html; charset=gb2312"%> <%request.setCharacterEncoding("GB2312");%> <% String action = request.getParameter("ACTION"); String name = ""; String str = ""; if(action!=null && action.equals("SENT")) { name = request.getParameter("name"); str = request.getParameter("str"); } %> <html> <head> <title></title> <Script language="JavaScript"> function Submit() { document.base.action = "?ACTION=SENT&str=传入的中文"; document.base.method = "POST"; document.base.submit(); } </Script> </head> <body bgcolor="#FFFFFF" text="#000000" topmargin="5"> <form name="base" method = "POST" target="_self"> <input type="text" name="name" value="" size="30"> <a href = "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
7、作者介绍
作者:柴政(abnerchai),1980年9月3日出生,高级程序员,西南交通大学计算机与通信工程学院计算机应用技术硕士研究生。研究方向为:网络安全,基于J2EE/EJB的中间件技术,项目管理/工作流等。作者联系方法:josserchai@yahoo.com 电话:028-87601939
[转自地址]http://tb.blog.csdn.net/TrackBack.aspx?PostId=18577
发表评论
-
[摘]析Unicode和UTF-8
2008-02-13 16:46 1063http://blog.csdn.net/lesterjam ... -
apache+weblogic 获取客户IP
2008-01-30 15:53 1462在apache+Weblogic整合系统中,apache会 ... -
[转]深入剖析Java编程中的中文问题及建议最优解决方法--上篇
2007-08-14 11:11 11011、中文问题的来源 计算机最初的操作系统支持的编码是 ... -
[转]web.xml配置详细说明
2007-04-04 13:26 25301 定义头和根元素 部署描述符文件就像所有XML文件一样,必 ...
相关推荐
### 深入剖析Java编程中的中文问题及建议最优解决方法 #### 1. 中文问题的来源 在探讨Java编程中的中文问题之前,我们首先需要理解计算机编码的基本概念及其发展历史。计算机最初的设计是为了处理单字节字符编码,...
Java编程中的中文问题主要源于字符编码的不匹配和转换过程中的错误。计算机早期主要使用单字节...通过理解和遵循这些最佳实践,开发者可以在Java编程中有效地避免和解决中文乱码问题,确保程序的稳定性和跨平台兼容性。
由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题。于是我给出此...
通过上述方法,可以有效解决Java在处理中文字符时可能出现的乱码问题,确保程序在各种环境下正确显示中文。在开发过程中,保持编码一致性,理解和利用Java提供的字符编码工具,是预防和解决这类问题的关键。
在深入剖析Java编程的过程中,掌握面试精华至关重要。Java作为一门广泛应用的编程语言,其面试环节往往涵盖了许多核心概念和技术,这些知识点不仅对于求职者来说是必须掌握的,也是提升自身编程能力的关键。以下是对...
《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm
### Java编程规范深入剖析 #### 1. 引言 - **目的**:本文档旨在为Java开发者提供一套详尽的编程规范,旨在确保代码的高效性和可靠性。这些规范基于安全可靠的软件工程原则制定,目的是使得代码易于理解、维护及...
深入剖析java面试题十道, 深入剖析java面试题十道
全书一共被压缩为5个rar,这是第二个!!!! 其他的请看ID:ljtt123(本人...21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
通过以上分析可以看出,《玩转电商系统深入剖析智慧电商平台》这本书不仅涵盖了电商平台的核心技术要点,还针对实际应用场景提出了具体的实践方案。无论是对于想要深入了解该领域的技术人员还是正在寻求解决方案的...
《深入剖析Tomcat》是一本专门针对Java领域的Web服务器Tomcat进行深度解析的权威书籍。这本书以高清中文的形式呈现,包含完整的章节目录,旨在帮助读者全面理解和掌握Tomcat的内部工作原理及其在实际开发中的应用。...
总之,理解中文字符的编码机制,以及JSP和Servlet处理编码的方式,对于解决中文乱码问题至关重要。开发者需要关注编码格式的匹配,确保数据在不同环境间正确转换,以保证应用程序的国际化和本地化功能正常运行。
本书是针对已经掌握Java基础的读者,旨在深入探讨Java编程的高级特性,帮助读者提升编程技巧和解决复杂问题的能力。 在这一版中,作者详细讲解了以下核心知识点: 1. **多线程**:Java的并发处理能力是其强大的...
在"Windows深入剖析-内核篇"中,作者详细讨论了以下几个关键知识点: 1. **Windows内核架构**:Windows内核是操作系统的核心部分,负责管理系统资源、调度任务、处理硬件中断和异常。书中会阐述内核的模块化设计,...
本资料集旨在通过一系列典型示例,深入剖析Java编程中的常见问题及其解决策略,帮助开发者更好地理解和运用Java语言。 1. 类与对象的设计 - 抽象类与接口:理解何时使用抽象类,何时使用接口,以及它们在多态中的...
《深入剖析Tomcat》是一本专注于Java Web...总之,《深入剖析Tomcat》涵盖了从基础到进阶的大量知识,通过学习,开发者不仅能理解Tomcat的工作流程,还能掌握如何利用源码解决实际问题,提升自己的Java Web开发技能。