《JAVA中文编码的问题研究.doc》由会员分享,可在线阅读,更多相关《JAVA中文编码的问题研究.doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、长沙理工大学Java语言程序设计课程论文 JAVA中文编码的问题的研究张桁诚 学 院 城南学院 专 业 计算机科学与技术 班 级 计算机1002 学 号 201086250215 学生姓名 张桁诚 指导教师 罗元盛 课程成绩 完成日期 2012年12月9日JAVA中文编码问题的研究学生姓名:张桁诚 指导老师:罗元盛摘 要 介绍了中文编码同Java的关系。根据Java程序的运行原理,分析了Java单机程序、在服务器上运行的JSP、关键字 编码;Java;单机程序;JSP1 引 言自从1946年世界上第一台电子计算机问世以来,计算模式的发展经历了三个阶段:集中计算模式、分散计算模式和网络计算模式。
2、Internet的出现,为在网络计算模式下的科学计算和信息处理提供了良好平台。然而,要充分利用网络计算模式的功能与效益,平台的运行环境是个制约因素,而Java语言和Java技术则是解决这一问题的最佳途径。1991年,SUN公司的Jame Gosling,Bill Joe等人试图为电视、烤箱等家用电器开发一种交互式的软件系统,这种应用需要的是那种小而可靠的系统,它能够移植,并且实时性好,适用于网络分布环境。流行的C+是自然的选择。不过,开发过程中遇到的许多难以克服的困难使他们意识到必须彻底解决问题了,最终,开发成功了一个名为Oak的软件,此中蕴藏着Java的原型,当时,并未引起人们的注意。199
3、4年下半年,随着Internet的迅猛发展,环球信息网WWW的快速增长,促进了Java语言研制的进展,使得它逐渐成为Internet上倍受欢迎的开发与编程语言。1995年5月Java正式问世,一些著名的计算机公司纷纷购买了Java语言的使用权,如Microsoft、IBM、Netscape、Novell、Apple、DEC、SGI等。因此,Java语言被美国著名杂志PC Magazine评为1995年十大优秀科技产品(计算机类仅此一项入选)之一,随之大量出现了用Java编写的软件产品,受到工业界的重视与好评,认为“Java是八十年代以来计算机界的一件大事”。微软总裁比尔盖茨在认真观察了一段时间
4、后,确认“Java是长时间以来最卓越的程序设计语言”,并确定微软整个软件的开发战略从PC单机时代向以网络为中心的计算时代转移,而购买Java则是他的重大战略决策的实施部署。因此,Java的诞生必将对整个计算机产业发生深远的影响,对传统的计算模型提出了新的挑战。SUN Microsystem公司的总裁Scott McNealy认为:Java对Internet和WWW开辟了一个崭新的时代。有人预言:Java将成为网络上的“世界语”,今后,用其他语言编写的软件统统都要用Java语言来改写。 1.1 Java预言的主要特点Java与C+相比,不再支持运算符重载、多级继承及广泛的自动强制等易混淆和较少使
5、用的特性,而增加了内存空间自动垃圾收集的功能,复杂特性的省略和实用能的增加使得开发变得简单而可靠。简单化的另一个方面是Java的系统非常小,其基本解释和类支持部分只占40KB,附加的基本标准库和线程支持也只需增加175KB。因此,Java应用软件能在相当小的系统之上独立工作。这是Java最吸引人的地方。由于它采用先编译成中间码(字节码),然后装载与校验,再解释成不同的机器码来执行,即“Java虚拟机”的思想,“屏蔽”了具体“平台环境”特性要求,使得只要能支持Java虚拟机,就可运行各种Java程序。面向对象(O-O)的技术是近年来软件开发中用得最为普遍的程序设计方法,它通过把客观事物进行分类组
6、合、参数封装、用成员变量来描述对象的性质、状态,而用方法(成员函数)来实现其行为和功能。O-O技术具有继承性、封装性、多态性等众多特点,Java在保留这些优点的基础上,又具有动态联编的特性,更能发挥出面向对象的优势。多线程机制使应用程序能并行执行,Java有一套成熟的同步原语 ,保证了对共享数据的正确操作.通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易实现网络上实时的交互行为。Java的设计使它适合于一个不断发展的环境。在类库中可以自由地加入新的方法和实例变量而不会影响用户程序的执行。并且Java通过接口来支持多重继承,使之比严格的类
7、继承具有更灵活的方式和扩展性。Java有建立在公共密钥技术基础上的确认技术.指示器语义的改变将使应用程序不能再去访问以前的数据结构或是私有数据,大多数病毒也就无法破坏数据.因而,用Java可以构造出无病毒、安全的系统。Java语言除上述主要特点外,还有高性能、分布性、强大性、解释性、可移植性等,此处不再 赘述。1.2 Java语言的发展Java自正式问世以来已经历了四年的历程,时间虽短,发展极快。一年一度在美国旧金山召开的世界Java One语言开发者大会(Java One Developer Conference)盛况空前正说明了这一点。四年中每年的Java One大会,既是了解Java最新
8、技术动态、应用成果和下一步发展趋势的最好场所,又是推动下一年Java快速发展的重要动力。2 JAVA中文编码2.1 问题描述计算机最初的操作系统支持的编码是单字节的字符编码,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。为了适应世界其它民族的语言(当然包括汉字),人们提出了UNICODE编码。它采用双字节编码,兼容英文字符和其它民族的双字节字符编码因此,目前大多数国际性的软件内部均采用UNICODE编码。在软件运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。Java的JDK和JVM即是如此
9、,这里说的JDK是指国际版的JDK,大多数程序员使用的是国际化的JDK版本。汉字是双字节编码语言,为了能让计算机处理中文,我国自己制定gb2312、GBK、GBK2K等标准以适应计算机处理的需求。因此,大部分的操作系统为了适应中文处理的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式来正确显示汉字。由于Java语言内部采用UNICODE编码,所以在Java程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换、输入、输出的问题,这个转换过程有着一系列的步骤,如果其中一步出错,则显示出来的汉字就是乱码,这就是常见的Java中文问题。关键问题的分
10、析及解决方案通常Java程序可以分为以下几个类型:(1)直接在console上运行的单机程序(包括可视化界面的类);(2)在服务器上运行的JSP、Servlets或EJB等;(3)分布式程序,客户端与服务运行于不同机器,而且语言环境可能不一致;目前网管应用就属于此种情况。以上这些类型的Java程序中,都有可能含有中文字符串,并且经常需要与用户直接交互,用于输出和输入字符,这些字符也包括中文字符。无论这些Java类的作用如何,这些Java程序的生命周期都是这样的:(1)编程人员在一定的操作系统上选择一个合适的编辑软件来实现源程序代码并以.java扩展名保存在操作系统中;(2)编程人员用JDK中的
11、javac.exe来编译这些源代码,形成.class类(JSP文件是由容器调用JDK来编译的);(3)直接运行这些类或将这些类布署到WEB容器中去运行,并输出结果。在程序运行过程中,JDK和JVM是按以下的步骤来完成编解码的过程。第一步,在中文win2k中用编辑软件如记事本编写一个Java源程序文件,程序文件在保存时默认采用了操作系统默认支持GBK编码格式(操作系统默认支持的格式为file.encoding格式)形成了一个.java文件,即java程序在被编译前,Java源程序文件是采用操作系统默认支持的file.encoding编码格式保存的,java源程序中含有中文信息字符和英文程序代码。
12、第二步,用JDK的javac.exe文件编译Java源程序。由于JDK是国际版的,在编译的时候,如果没有用-encoding参数指定Ja-va源程序的编码格式,则javac.exe首先获得操作系统默认采用的编码格式。即在编译java程序时,若不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把java源程序从file.encoding编码格式转化为Java内部默认的UNICODE格式放入内存中。然后,javac把转换后的uni-code格式的文件进行编译成.class类文件,此时.
13、class文件是U-NICODE编码的,它暂放在内存中。紧接着,JDK将此以UNI-CODE编码的编译后的class文件保存操作系统中形成.class文件。对程序员来说,最终获得的.class文件是内容以UNICODE编码格式保存的类文件。它内部包含源程序中的中文字符串,且己经由file.encoding格式转化为UNICODE格式了。在这一步中,对于JSP源程序文件是不同的。对于JSP,过程是这样的:即WEB容器调用JSP编译器,JSP编译器先查看JSP文件中是否设置有文件编码格式。如果JSP文件中没有设置JSP文件的编码格式,则JSP编译器调用JDK先把JSP文件用JVM默认的字符编码格式
14、(也即WEB容器所在的操作系统的默认的file.encoding)转化为临时的Servlet类,然后再编译成UNICODE格式的class类,并保存在临时文件夹中。第三步,运行第二步编译出来的类,分为以下三种情况:(1)单机程序,运行该类首先需要JVM支持,即操作系统中必须安装有JRE。运行过程如下:首先java启动JVM,此时JVM读出操作系统中保存的class文件并把内容读入内存中,此时内存中为UNICODE格式的class类,然后JVM运行它。如果此类需要接收用户输入,则类会默认用file.encoding编码格式对用户输入的串进行编码并转化为unicode保存入内存(用户可以设置输入流
15、的编码格式)。程序运行后,产生的字符串(UNICODE编码的)再回交给JVM,最后JRE把此字符串再转化为file.encoding格式(用户可以设置输出流的编码格式)传递给操作系统显示接口并输出到界面上。以上每一步的转化都需要正确的编码格式转化,才能最终不出现乱码现象。(2)在Web服务器中运行,客户端请求它时,WEB容器调用JVM来运行Servlet。首先,JVM把Servlet的class类从系统中读出并装入内存中,内存中是以UNICODE编码的Servlet类的代码,然后JVM在内存中运行该Servlet类,如果Servlet在运行的过程中需要接受从客户端传来的字符,如表单输入的值和U
16、RL中传入的值,此时如果程序中没有设定接收参数时采用的编码格式,则WEB容器会默认采用ISO-8859-1编码格式来接受传入的值,在JVM中转化为UNICODE格式并保存在WEB容器的内存中。Servlet运行后生成输出,输出的字符串是UNICODE格式的,WEB容器将Servlet运行产生的UNICODE格式的串(如html语法,用户输出的串等)直接发送到客户端浏览器上并输出给用户。如果指定了发送时输出的编码格式,则按指定的编码格式输出到浏览器上,如果没有指定,则默认按ISO-8859-1编码发送到客户的浏览器上。另外,对于数据库的JDBC驱动程序,默认在Java程序和数据库之间传递的数据都
17、是以ISO-8859-1为默认编码格式的。因此,程序在向数据库内存储包含中文的数据时,JDBC首先是把程序内部的UNICODE编码格式的数据转化为ISO-8859-1格式,然后传递到数据库中,在数据库保存数据时,它默认以ISO-8859-1保存,这就是为什么常常在数据库中读出的中文数据是乱码的原因。3)分布式程序,对于服务端与客户端开发语言均为Java时,处理流程同第一种情况。但对于网管系统来说,一般客户端是Java实现的,而服务端是C+实现的,中间通过Socket通信。此种情况与单机版程序的区别就在于Java的客户端在处理服务端的数据流时需要注意二个方面的问题:字节序问题与编码方式问题。Ja
18、va的IO操作均采用的网络序(大字节序),如果服务端的字节序不是网络序而需要先进行字节序的转换,在确保字节序一致时,将数据流转换成字符串,需要采用与服务端一致的编码方式将数据流转换成字符串,这样才不会出现乱码问题。3 结束语解决Java程序中文问题总的原则是,在Java程序数据转码的入口和出口,包括用户输入、输出、数据库读写或配置文件读取等处理时,明确数据流的编码方式,保证编码与解码的方式一致,这样就能确保不会出现乱码问题。在网管系统的开发过程中处理中文时需要注意服务端的字节序与编码方式必须一致,如果不一致则需要进行相应的转换,否则会出现乱码问题。在设计时为了保证效率尽量减少编码转换的次数,对于Java来说,处理采用Unicode进行编码的字节效率会比较高。参考文献1金恩华,徐良贤J2EE Web应用中汉字编码的研究J.计算机应用与软件,2005(6).2Sun White Paper.InternationalizationOL/DK.(2001-01) :/ java.sun .3徐诚,徐敬.JSP中文问题分析及解决方案J.计算机时代,2003(12).4Many Hall,Larry BrownServlet与JSP核心编程(第2版)M北京:清华大学出版社,20045詹晓晖,刘建生.Web应用中的数据访问模型与Java实现J.南方冶金学院学报,2005(5).