`
wanjianfei
  • 浏览: 306821 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中文问题的分类

    博客分类:
  • J2SE
阅读更多

中文问题的分类及其建议最优解决办法 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 

了解以上JAVA处理文件的原理之后,我们就可以提出了一套建议最优的解决汉字问题的办法。
我们的目标是:我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行,或拿到其它操作系统中编译后能正确运行,能正确地传递中文和英文参数,能正确地和数据库交流中英文字符串。
我们的具体思路是:在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即可。

 

 

具体解决办法如下:

 

 

1 针对直接在console上运行的类
对于这种情况,我们建议在程序编写时,如果需要从用户端接收用户的可能含有中文的输入或含有中文的输出,程序中应该采用字符流来处理输入和输出,具体来说,应用以下面向字符型节点流类型:
对文件:FileReaderFileWrieter
其字节型节点流类型为:FileInputStreamFileOutputStream
对内存(数组):CharArrayReaderCharArrayWriter
其字节型节点流类型为:ByteArrayInputStreamByteArrayOutputStream
对内存(字符串):StringReaderStringWriter
对管道:PipedReaderPipedWriter
其字节型节点流类型为:PipedInputStreamPipedOutputStream
同时,应该用以下面向字符型处理流来处理输入和输出:
BufferedWriter
BufferedReader
其字节型的处理流为:BufferedInputeStreamBufferedOutputStream
InputStreamReader
OutputStreamWriter
其字节型的处理流为:DataInputStreamDataOutputStream
其中InputStreamReaderInputStreamWriter用于将字节流按照指定的字符编码集转换到字符流,如:
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
其运行结果如图5所示:

 

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1026" style="WIDTH: 318pt; HEIGHT: 138.75pt" type="#_x0000_t75" alt="" o:button="t"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.gif" o:href="http://www.webasp.net/article/uploadfile/200504/200541311020722.gif"></imagedata></shape>

 

 

5
2 针对EJB类和不可以直接运行的支持类(JavaBean)

 

 

由于这种类它们本身被其它的类调用,不直接与用户交互,故对这种类来说,我们的建议的处理方式是内部程序中应该采用字符流来处理程序内部的中文字符串(具体如上面一节中一样),同时,在编译类时用-encoding gb2312参数指示源文件是中文格式编码的即可。

 

 


3 针对Servlet

 

 

针对Servlet,我们建议用以下方法:

 

 

在编译Servlet类的源程序时,用-encoding指定编码为GBKGB2312,且在向用户输出时的编码部分用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>
其运行结果如图6所示:

 

 

<shape id="_x0000_i1027" style="WIDTH: 305.25pt; HEIGHT: 246pt" type="#_x0000_t75" alt="" o:button="t"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image002.gif" o:href="http://www.webasp.net/article/uploadfile/200504/200541311020140.gif"></imagedata></shape>

 

 

6
4 JAVA程序和数据库之间

 

 

为避免JAVA程序和数据库之间数据传递出现乱码现象,我们建议采用以下最优方法来处理:
1
对于JAVA程序的处理方法按我们指定的方法处理。
2
把数据库默认支持的编码格式改为GBKGB2312的。

 

 

如:在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和在英文Linuxfile.encoding是不同的,且英文Linuxfile.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>
如图7是此程序运行的结果示意图:

 

 

<shape id="_x0000_i1025" style="WIDTH: 375pt; HEIGHT: 259.5pt" type="#_x0000_t75" alt="" o:button="t"><imagedata src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.gif" o:href="http://www.webasp.net/article/uploadfile/200504/200541311020506.gif"></imagedata></shape>

 

 

7

 

 

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 实现

    java 代码实现的网络新闻文本自动分类,采用朴素贝叶斯和支持向量机两种方法实现!

    JAVA_API1.6文档(中文)

    javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print....

    中文文本分类源代码 使用JAVA

    文本分类源代码 主要是中文文本分类 其他的话 看看我的空间

    Java 1.6 API 中文 New

    Java 1.6 API的中文帮助文档。 深圳电信培训中心徐海蛟博士教学用api中文文档。支持全文检索,在线即时查询。 里面列出了,Java的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 applet 所...

    贝叶斯文本分类器JAVA

    贝叶斯文本分类器JAVA,有lucene-core-2.9.4,je-analysis-1.5.1包

    JavaAPI1.6中文chm文档 part1

    javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print....

    java通过括特征选取、特征降维、分类模型学习三个步骤完成自动智能分类

    如何选取合适的文本特征并进行降维,是中文文本分类的挑战性问题。我组根据多年在中文文本分类的研究经验,在THUCTC中选取二字串bigram作为特征单元,特征降维方法为Chi-square,权重计算方法为tfidf,分类模型使用...

    中文文本分类

    现代信息检索课的大作业,刚完成。热乎的。能够实现中文文本的话题分类。

    java api最新7.0

    Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列出了Java jdk 1.7的所有类及其使用方法! Java SE Platform 软件包: java.applet 提供创建 ...

    Thinking in Java简体中文(全)

    16.1.2 范式分类 16.2 观察器范式 16.3 模拟垃圾回收站 16.4 改进设计 16.4.1 “制作更多的对象” 16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI...

    java联想(中文)

    16.1.2 范式分类 16.2 观察器范式 16.3 模拟垃圾回收站 16.4 改进设计 16.4.1 “制作更多的对象” 16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI...

    java 基础分类作业

    《HeadFirstJava》(中文版)(第2版)是本完整的面向对象(object-oriented,OO)程序设计和Java的学习指导。此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程、网络与分布式程序等项目。最...

    JavaAPI中文chm文档 part2

    javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print....

    java jdk-api-1.6 中文 chmd

    javax.print.attribute 提供了描述 JavaTM Print Service 属性的类型以及如何分类这些属性的类和接口。 javax.print.attribute.standard 包 javax.print.attribute.standard 包括特定打印属性的类。 javax.print....

    Thinking in Java 中文第四版+习题答案

    16.1.2 范式分类 16.2 观察器范式 16.3 模拟垃圾回收站 16.4 改进设计 16.4.1 “制作更多的对象” 16.4.2 用于原型创建的一个范式 16.5 抽象的应用 16.6 多重派遣 16.6.1 实现双重派遣 16.7 访问器范式 16.8 RTTI...

    动力节点JAVA完美学习课程 JAVA黄埔军校2018年最新JAVA夜校班全程班视频教程 1-56部分.txt

    ├─(4) 004-Java夜校视频教程-软件的分类.avi ├─(5) 005-Java夜校视频教程-常见DOS命令.avi ├─(6) 006-Java夜校视频教程-Java语言发展史.avi ├─(7) 007-Java夜校视频教程-Java语言特点.avi ├─(8) 008-Java...

    Java教程和ppt

    主要有CoreJava笔记.doc JAVAeclipse中文教程.rar Java集中测试类题目(已分类)3.doc JAVA讲义.rar java课本PPT.rar

    Java 实现的自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换.zip

    Java 实现的自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换。.zip,自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 新词发现 关键词短语提取 ...

    编程实践:Java进阶100例

    中文名: 编程实践:Java进阶100例 原名: 编程实践:Java进阶100例 别名: Java 作者: 李相国等. 译者: 李相国等. 图书分类: 软件 资源格式: PDF 版本: 影印版 出版社: 李相国等. 书号: 9787111372370. 发行...

Global site tag (gtag.js) - Google Analytics