`

深入Java中文问题及最优解决方法(2)

阅读更多



第三步,运行第二步编译出来的类,分为三种情况:

A、 直接在console上运行的类
B、 EJB类和不可以直接运行的支持类(如JavaBean类)
C、 JSP代码和Servlet
D、 JAVA程序和数据库之间
下面我们分这四种情况来看。
A、直接在console上运行的类

这种情况,运行该类首先需要JVM支持,即操作系统中必须安装有JRE。运行过程是这样的:首先java启动JVM,此时JVM读出操作系统中保存的class文件并把内容读入内存中,此时内存中为UNICODE格式的class类,然后JVM运行它,如果此时此类需要接收用户输入,则类会默认用file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存(用户可以设置输入流的编码格式)。程序运行后,产生的字符串(UNICODE编码的)再回交给JVM,最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。

对于这种直接在console上运行的类,它的转化过程可用图1更加明确的表示出来:

以上每一步的转化都需要正确的编码格式转化,才能最终不出现乱码现象。

B、EJB类和不可以直接运行的支持类(如JavaBean类)

由于EJB类和不可以直接运行的支持类,它们一般不与用户直接交互输入和输出,它们常常与其它的类进行交互输入和输出,所以它们在第二步被编译后,就形成了内容是UNICODE编码的类保存在操作系统中了,以后只要它与其它的类之间的交互在参数传递过程中没有丢失,则它就会正确的运行。
这种EJB类和不可以直接运行的支持类, 它的转化过程可用图2更加明确的表示出来:


图2


C、JSP代码和Servlet类

经过第二步后,JSP文件也被转化为Servlets类文件,只不过它不像标准的Servlets一校存在于classes目录中,它存在于Web容器的临时目录中,故这一步中我们也把它做为Servlets来看。

对于Servlets,客户端请求它时,WEB容器调用它的JVM来运行Servlet,首先,JVM把Servlet的class类从系统中读出并装入内存中,内存中是以UNICODE编码的Servlet类的代码,然后JVM在内存中运行该Servlet类,如果Servlet在运行的过程中,需要接受从客户端传来的字符如:表单输入的值和URL中传入的值,此时如果程序中没有设定接受参数时采用的编码格式,则WEB容器会默认采用ISO-8859-1编码格式来接受传入的值并在JVM中转化为UNICODE格式的保存在WEB容器的内存中。Servlet运行后生成输出,输出的字符串是UNICODE格式的,紧接着,容器将Servlet运行产生的UNICODE格式的串(如html语法,用户输出的串等)直接发送到客户端浏览器上并输出给用户,如果此时指定了发送时输出的编码格式,则按指定的编码格式输出到浏览器上,如果没有指定,则默认按ISO-8859-1编码发送到客户的浏览器上。这种JSP代码和Servlet类,它的转化过程可用图3更加明确地表示出来:


图3

D、Java程序和数据库之间

对于几乎所有数据库的JDBC驱动程序,默认的在JAVA程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式的,所以,我们的程序在向数据库内存储包含中文的数据时,JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1的格式,然后传递到数据库中,在数据库保存数据时,它默认即以ISO-8859-1保存,所以,这是为什么我们常常在数据库中读出的中文数据是乱码。
对于JAVA程序和数据库之间的数据传递,我们可以用图4清晰地表示出来


图4


3、分析常见的JAVA中文问题几个必须清楚的原则

首先,经过上面的详细分析,我们可以清晰地看到,任何JAVA程序的生命期中,其编码转换的关键过程是在于:最初编译成class文件的转码和最终向用户输出的转码过程。
其次,我们必须了解JAVA在编译时支持的、常用的编码格式有以下几种:
*ISO-8859-1,8-bit, 同8859_1,ISO-8859-1,ISO_8859_1等编码
*Cp1252,美国英语编码,同ANSI标准编码
*UTF-8,同unicode编码
*GB2312,同gb2312-80,gb2312-1980等编码
*GBK , 同MS936,它是gb2312的扩充
及其它的编码,如韩文、日文、繁体中文等。同时,我们要注意这些编码间的兼容关体系如下:
unicode和UTF-8编码是一一对应的关系。GB2312可以认为是GBK的子集,即GBK编码是在gb2312上扩展来的。同时,GBK编码包含了20902个汉字,编码范围为:0x8140-0xfefe,所有的字符可以一一对应到UNICODE2.0中来。

再次,对于放在操作系统中的.java源程序文件,在编译时,我们可以指定它内容的编码格式,具体来说用-encoding来指定。注意:如果源程序中含有中文字符,而你用-encoding指定为其它的编码字符,显然是要出错的。用-encoding指定源文件的编码方式为GBK或gb2312,无论我们在什么系统上编译含有中文字符的JAVA源程序都不会有问题,它都会正确地将中文转化为UNICODE存储在class文件中。

然后,我们必须清楚,几乎所有的WEB容器在其内部默认的字符编码格式都是以ISO-8859-1为默认值的,同时,几乎所有的浏览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以,虽然我们的Java源文件在出入口的地方指定了正确的编码方式,但其在容器内部运行时还是以ISO-8859-1来处理的。

分享到:
评论

相关推荐

    深入剖析Java 编程中的中文问题及建议最优解决方法

    ### 深入剖析Java编程中的中文问题及建议最优解决方法 #### 1. 中文问题的来源 在探讨Java编程中的中文问题之前,我们首先需要理解计算机编码的基本概念及其发展历史。计算机最初的设计是为了处理单字节字符编码,...

    JAVA中文问题解析和最优解决办法

    ### JAVA中文问题解析和最优解决办法 #### 一、引言 随着信息技术的快速发展与全球化进程的加速,软件开发越来越需要支持多语言环境,特别是中文环境。Java作为一门跨平台的编程语言,广泛应用于Web应用、企业级...

    深入剖析Java编程中的中文问题及建议最优解决方法.pdf

    解决Java中文问题的关键在于理解和管理编码的转换过程。以下是一些建议的最优解决方案: 1. 设置正确的file.encoding:在开发环境中,可以通过修改JDK启动参数 `-Dfile.encoding=UTF-8` 来确保源文件的正确解析。 ...

    Java解惑 中文版

    《Java解惑中文版》是一本专为Java程序员设计的指南,旨在帮助读者解决在编程过程中遇到的各种问题,提升程序的健壮性。本书深入浅出地探讨了Java语言的核心概念、常见疑惑以及最佳实践,旨在使开发者能够编写出更...

    Java数据结构和算法中文第二版_Java数据结构_

    《Java数据结构和算法中文第二版》是...通过阅读《Java数据结构和算法中文第二版》,开发者可以深入了解数据结构和算法,提升编程能力,解决实际工程中的复杂问题。无论是初学者还是有经验的开发者,都能从中获益匪浅。

    java算法大全[文字版]中文

    《Java算法大全》是一本专为Java程序员设计的算法学习指南,它涵盖了各种常见的数据结构和算法,并以中文形式呈现,方便国内读者阅读。这本书的特点是提供了高清的文字版,而非扫描版,使得阅读和查找信息更为便捷。...

    java经典算法(PPT资源)

    这份"Java经典算法(PPT资源)"包含了9个章节,旨在深入讲解如何使用Java语言来实现各种算法,帮助开发者提升解决问题的能力和代码效率。以下是这些章节可能涵盖的一些关键知识点: 1. **排序算法**:包括冒泡排序、...

    Java数据结构和算法中文第二版

    总之,《Java数据结构和算法中文第二版》是一本全面且深入的教材,它将带你走进数据结构和算法的世界,通过Java语言实践,提高你的编程技巧和问题解决能力。无论你是初学者还是有经验的开发者,都能从中受益匪浅。

    算法:Java对拼音进行智能切分

    标题中的“Java对拼音进行智能切分”涉及的是自然语言处理(NLP)中的一个关键问题,即中文字符到拼音的转换以及拼音的分词。在这个过程中,我们通常需要处理多音字、同音词等问题,以实现更准确的拼音切分。下面将...

    数据结构与算法分析(java语言描述)中文第二版以及习题答案

    总之,《数据结构与算法分析(Java语言描述)中文第二版》结合习题答案,为Java开发者提供了一个全面的学习资源,旨在提升他们的数据处理和问题解决能力,这对于软件开发、系统设计和优化等各个方面都至关重要。...

    Java数据结构和算法.(第二版).rar

    贪心算法则采取局部最优解来尝试达到全局最优,而在无法确保全局最优时,回溯法则是一种有效的试探性解决方法。 最后,对于算法效率的衡量,时间复杂性和空间复杂性分析是不可或缺的部分。这些分析工具帮助开发者...

    Java数据结构和算法中文版

    "Java数据结构和算法中文版"是一本专为中文读者设计的教材,旨在帮助读者深入理解如何在Java语言中有效地组织和操作数据。以下是根据标题、描述以及可能包含的文件内容提炼出的一些关键知识点: 1. **数组**:作为...

    java版数据结构与算法(中文)

    《Java版数据结构与算法(中文)》是一个珍贵的学习资源,专为想要深入理解数据结构与算法,并且希望使用Java语言实现的读者设计。数据结构是计算机科学的基础,它研究如何在内存中有效地组织和存储数据,以提高数据...

    Java数据结构和算法(中文)

    《Java数据结构和算法(中文)》第二版是一本针对Java程序员深入理解数据结构与算法的优秀教材。这本书旨在帮助读者更好地掌握编程基础,提升解决问题的能力,并为实际开发中的高效代码编写提供理论支持。以下是对...

    JAVA数据结构与算法(中英全)

    动态规划通常用于优化决策,贪心算法每次做出局部最优决策,回溯法用于在搜索过程中撤销错误决策,分治策略则是将大问题分解为小问题来解决。 此外,学习"JAVA数据结构与算法"还包括理解和实现数据结构和算法的时间...

Global site tag (gtag.js) - Google Analytics