`
wanjianfei
  • 浏览: 319250 次
  • 性别: 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

    **中文文本分类源代码 使用JAVA** 在信息技术领域,文本分类是一项关键任务,它涉及将文本数据自动归类到预定义的类别中。这个任务在信息检索、情感分析、垃圾邮件过滤等多个场景中都有广泛的应用。Java作为一种...

    使用Java语言版的文本分类

    在本项目"使用Java语言版的文本分类"中,我们将探讨如何利用Java实现这一功能,结合Tf-IDF、SVM模型、NlpirMulti和CHI方法。 首先,我们要理解文本分类的基本流程。它通常包括以下几个步骤: 1. **数据预处理**:...

    JAVA_API1.6文档(中文)

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

    JAVA中文文档分句工具

    Java中文文档分句工具是一款专为处理英文文本文件设计的应用,它主要实现了以下几个核心功能,对于深入理解和使用Java编程语言处理文本数据具有重要的实践意义。 首先,该工具能够按照特定的标点符号对英文文本进行...

    贝叶斯文本分类器JAVA

    总的来说,贝叶斯文本分类器JAVA项目结合了Lucene和特定的中文分词库,为开发者提供了一个实现文本分类任务的平台。开发者可以通过这个框架进行文本分析、特征提取,进而训练和应用分类模型,实现高效、准确的文本...

    汉字转拼音、首字母、多音字java

    在Java编程语言中,处理汉字转换为拼音、获取汉字首字母以及处理多音字的问题是一项常见的任务,尤其在中文信息处理、搜索引擎优化(SEO)或者中文输入法开发等领域。这里我们将详细探讨这些知识点。 首先,我们要...

    JAVA API官方文档中文版

    查阅这份中文版的API文档,开发者可以了解到Java API的全貌,理解并熟练运用各种类库,提高编程效率。无论是在学习阶段还是实际开发中,它都是一个不可或缺的工具。在遇到问题时,可以直接搜索对应类或方法的详细...

    Java,获取汉字拼音、部首、笔画、笔画数目源文件、源码

    部首是汉字的基本构造单元,通常用于字典的查找和分类。在Java中,我们需要一个包含部首信息的数据结构,如字典或者数据库,来匹配和获取特定汉字的部首。这样的数据通常不会内置在标准Java库中,因此可能需要从外部...

    Java 1.6 API 中文 New

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

    effecive java 中文版 第二版

    根据提供的信息,“Effective Java 中文版 第二版”这本书主要关注的是Java编程语言的最佳实践、设计模式以及如何编写高效、可维护的Java代码。虽然给定的部分内容并未提供实际的文字内容,但从标题和描述来看,我们...

    中文文本分类

    由于中文字符的复杂性,如无空格分词问题,预处理通常包括分词(如使用jieba分词库)、去除停用词、词干提取和词形还原等步骤。此外,可能还需要进行词性标注和命名实体识别,以提高分类效果。 其次,**特征表示**...

    Thinking in java 中文版

    《Thinking in Java》是Java编程领域的一本经典著作,由Bruce Eckel撰写,中文版的出版使得更多中文读者能够深入理解这门强大的编程语言。这本书以其深入浅出、全面覆盖的特点,深受Java学习者的喜爱,被誉为Java...

    Java OCR 图像智能字符识别技术,可识别中文

    对于中文字符的识别,Java OCR面临更大的挑战,因为中文字符数量庞大且形状复杂。常用的Java OCR库如Tesseract、EasyOCR等都支持中文识别,但需要额外配置语言数据包。例如,Tesseract需要下载中文语言数据包(`chi_...

    java 中文分词插件

    Java中文分词插件是Java开发中用于处理中文文本的重要工具,它主要的功能是对中文文本进行拆分,将其转换为可被计算机理解的单个词汇,这一过程被称为分词。在自然语言处理(NLP)领域,中文分词是基础且关键的一步...

    JAVA-api.rar_2017java中文api_java pro_java API_java api_java在线a

    这个压缩包文件"JAVA-api.rar_2017java中文api_java pro_java API_java api_java在线a"包含的是2017年的Java中文版API文档,这对于Java初学者和专业开发者来说都是一份极其重要的参考资料。"java pro"可能指的是专业...

    prictical java 中文版及其笔记

    3. **异常处理**:介绍了Java中的异常处理机制,包括try-catch-finally结构和异常的分类,以及如何自定义异常。 4. **集合框架**:详细解析了Java集合框架,如ArrayList、LinkedList、HashSet、HashMap等,以及它们...

    java函数速查中文版

    Java函数速查通常会按照类库分类,列出各个类下的方法,并提供参数类型、返回值、函数描述等关键信息。 在Java函数速查中,你可以找到以下关键知识点: 1. **基础数据类型与包装类**:Java提供了八种基础数据类型...

    java核心技术卷1第九版高清中文版

    标题《java核心技术卷1第九版高清中文版》指的是这本图书是关于Java编程语言的基础核心知识介绍,是Java技术领域中的经典教材。本书的第九版是最新版,其中文版的发布意味着它已被翻译成中文,这极大地方便了中国...

    Linux中java log输出中文乱码.docx

    Linux 中 Java log 输出中文乱码问题是 Java 应用程序在 Linux 环境下一个常见的问题。该问题的产生是由于 Linux 系统的 locale 设置不正确导致的。locale 是 Linux 系统中用于控制字符编码、日期格式、货币格式、...

Global site tag (gtag.js) - Google Analytics