Java 编程技术中汉字问题的分析及解决

合集下载

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策随着互联网的快速发展,Java在Web项目开发中的应用越来越广泛。

但是在开发过程中,很多程序员都会遇到中文乱码的问题,这不仅影响了用户体验,也给开发者带来了不小的困扰。

本文将针对Java Web项目开发中的中文乱码问题进行分析,并提出解决方法。

一、中文乱码问题的原因1. 字符编码不一致在Java Web项目中,很多地方都会涉及到字符编码的设置,比如在数据库、页面、请求参数等地方。

如果这些地方的字符编码设置不一致,就会导致中文乱码。

2. 数据传输中的转换问题在Web项目中,数据的传输是非常常见的操作。

如果在数据传输过程中没有正确设置编码格式,就会导致中文乱码。

3. 操作系统环境问题在不同的操作系统环境下,可能会存在默认的字符编码设置不一致的问题,也会导致中文乱码。

2. 使用UTF-8编码在开发过程中,建议尽量使用UTF-8编码格式。

UTF-8是一种通用的字符编码格式,能够支持几乎所有的字符。

使用UTF-8编码可以很大程度上解决中文乱码问题。

3. 设置请求和响应的字符编码在Web项目中,可以通过设置请求和响应的字符编码来解决中文乱码问题。

在请求处理的过程中,需要设置合适的字符编码格式,以确保数据传输的正确性。

4. 使用String.getBytes和new String方法进行转换在具体的代码中,可以使用String.getBytes和new String方法进行字符编码的转换。

通过这两个方法可以将字符按照指定的编码进行转换,避免中文乱码问题。

6. 使用第三方库进行编码处理在Java中有一些第三方库可以用来处理字符编码的问题,比如Apache Commons Codec 库、Google Guava库等。

通过使用这些库,可以方便地解决中文乱码问题。

三、总结在Java Web项目开发中,中文乱码问题是一个比较常见的难题。

但是通过合理的设置和编码处理,可以很好地解决这个问题。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策随着互联网的快速发展,Java Web项目越来越受到开发者的青睐。

但是在开发Java Web项目的过程中,中文乱码问题却是一个让人头痛的难题。

中文乱码问题不仅会影响用户体验,还会导致数据传输错误、展示异常等严重后果。

对于Java Web项目开发中的中文乱码问题,我们必须深入了解原因并采取有效的对策来解决。

一、中文乱码问题的原因1. 字符集不匹配中文乱码问题的主要原因之一是字符集不匹配。

在Java中,字符集通常指的是编码方式,常见的编码方式包括UTF-8、GBK、ISO-8859-1等。

如果前端网页使用UTF-8进行编码,而后端服务器端使用了GBK进行解码,那么就会导致中文乱码问题的出现。

2. 数据库编码不一致另一个导致中文乱码问题的原因是数据库编码不一致。

在数据库中存储的数据也需要使用特定的编码方式进行存储和读取,如果数据库的编码方式和Java代码或前端网页的编码方式不匹配,也会导致中文乱码问题。

3. 网络传输和解析问题在Java Web项目中,数据经常需要在前端和后端之间进行传输和解析。

如果在数据传输过程中,传输的数据编码方式与接收方的解析方式不一致,就会导致中文乱码问题的出现。

1. 统一字符集为了解决中文乱码问题,我们首先需要统一字符集。

一般来说,推荐在Java Web项目中使用UTF-8作为字符集的统一标准。

我们需要确保在前端网页、Java代码和数据库中都使用UTF-8进行编码和解码,这样能够有效地避免字符集不匹配导致的中文乱码问题。

在前端网页中,我们可以通过设置<meta charset="UTF-8">来指定页面的字符集为UTF-8。

在Java代码中,我们可以通过在代码中明确指定字符串的编码方式为UTF-8来避免乱码问题。

在数据库中,我们可以通过修改表的编码方式为UTF-8或者在连接数据库的时候指定编码方式为UTF-8来解决中文乱码问题。

Java 编程技术中汉字问题

Java 编程技术中汉字问题

中文编码的处理每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码, 中国的GB2312-80,日本的JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。

字符编码集按长度分为SBCS(单字节字符集),DBCS(双字节字符集)两大类。

早期的软件(尤其是操作系统),为了解决本地字符信息的计算机处理,出现了各种本地化版本(L10N),为了区分,引进了LANG, Codepage 等概念。

但是由于各个本地字符集代码范围重叠,相互间信息交换困难;软件各个本地化版本独立维护成本较高。

因此有必要将本地化工作中的共性抽取出来,作一致处理,将特别的本地化处理内容降低到最少。

这也就是所谓的国际化(I18N)。

各种语言信息被进一步规范为Locale 信息。

处理的底层字符集变成了几乎包含了所有字形的Unicode。

现在大部分具有国际化特征的软件核心字符处理都是以Unicode 为基础的,在软件运行时根据当时的Locale/Lang/Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符。

在处理过程中需要实现Unicode 和本地字符集的相互转换,甚或以Unicode 为中间的两个不同本地字符集的相互转换。

这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。

Java 语言内部是用Unicode 表示字符的,遵守Unicode V2.0。

Java 程序无论是从/往文件系统以字符流读/写文件,还是往URL 连接写HTML 信息,或从URL 连接读取参数值,都会有字符编码的转换。

这样做虽然增加了编程的复杂度,容易引起混淆,但却是符合国际化的思想的。

从理论上来说,这些根据字符集设置而进行的字符转换不应该产生太多问题。

而事实是由于应用程序的实际运行环境不同,Unicode 和各个本地字符集的补充、完善,以及系统或应用程序实现的不规范,转码时出现的问题时时困扰着程序员和用户。

JAVA编程中文问题

JAVA编程中文问题

(2)中文问题浏览器对表单中的数据(非ascii字符)会进行编码。

所使用的编码是打开该表单所在的页面时所使用的编码。

step1 静态页面(html),使用<meta http-equiv="content-type" content="text/html;charset=utf-8"> 指定打开页面时的编码。

step2 在servlet当中容器解码时解成java虚拟机的unicode编码格式到内存中(默认控制台输出为GBK编码) a, request.setCharacterEncoding("A");只对POST方式有效!!指定request以什么格式进行解码。

与客户端浏览器编码时所用的编码一致;b,如果要输出数据到浏览器(out.println()),还要使用response.setContentType("text/html;charset=B");B支持中文告诉response.getWriter()以这个形式去编码(从内存中读数据进行编码)(这个编码无所谓,只要支持中文); 并告诉客户端浏览器以这个形式去解码。

// 作用一:向response.getWriter()流当中输入数据时,设置编码为utf-8。

// 作用二:向浏览器发送一个消息头,告诉浏览器返回的数据以utf-8来显示。

b这一句等价于这两句:// response.setCharacterEncoding("utf-8");// response.setContentType("text/html");step3 如果要保存数据到数据库。

a, 创建数据库时,使用create database sd1101db2 defaultcharacter set utf8;b, jdbc驱动程序,指定数据库编码,即告诉驱动程序,当前数据库保存数据所使用的编码是什么。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策在Java Web项目开发过程中,中文乱码问题是一个常见的挑战。

乱码问题通常发生在将中文数据存储到数据库、从数据库读取中文数据、在页面上展示中文数据等环节,如果不正确处理乱码问题,会导致用户无法正常阅读中文内容,影响用户体验。

下面介绍一些常见的中文乱码问题和对策。

1. 数据库乱码:当将中文数据存储到数据库中时,如果数据库的字符集不是UTF-8,会导致乱码问题。

解决方法是将数据库字符集设置为UTF-8,确保中文数据能够正确存储和读取。

2. 请求参数乱码:当用户提交包含中文字符的表单时,请求参数中的中文字符可能会出现乱码问题。

解决方法是在服务器端统一设置请求参数的编码为UTF-8,可以通过在web.xml文件中添加如下配置实现:```xml<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-c lass><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>``````html<meta charset="UTF-8">```4. 文件编码乱码:如果在Java Web项目中读取外部的文本文件,文件的编码可能与项目编码不一致,导致读取中文内容乱码。

java中文乱码问题

java中文乱码问题

Java web编程中,经常遇到汉字的问题,现在总结一下。

工程的编码模式是utf-8。

我遇到的最多的问题就是通过?由前台向后台传值。

解决方法就行后台接受的时候request.setCharacterEncoding("UTF-8");this.tempValue = new String(tempValue.getBytes("ISO-8859-1"), "UTF-8");下面附上网上查询的资料1、在网页中输出中文。

JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如:String str="中文";str=new String(str.getBytes("GB2312"),"8859_1");但假如在编译程序时,使用的编码是“GB2312”,且在中文平台上运行此程序,不会出现此问题,一定要注重。

2、从参数中读取中文这正好与在网页中输出相反如:str=new String(str.getBytes("8859_1"),"GB2312");3、操作DB中的中文问题一个较简单的方法是:在“控制面扳”中,把“区域”设置为“英语(美国)”。

假如还会出现乱码,还可进行如下设置:取中文时:str=new String(str.getBytes("GB2312"));向DB中输入中文:str=new String(str.getBytes("ISO-8859-1"));4、在jsp中的中文解决:在“控制面扳”中,把“区域”设置为“英语(美国)”.在JSP页面中加入:假如还不行正常显示,则还要进行下面的转换:如:name=new String(name.getBytes("ISO-8859-1"),"GBK");就不会出现中文问题了。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策在Java Web项目开发中,中文乱码问题是一个常见的挑战。

当我们接收、处理和展示中文数据时,如果不正确地处理字符编码,就可能导致中文乱码的问题。

下面是一些常见的中文乱码问题及其对策。

1. 请求参数中的中文乱码:当浏览器发送一个带有中文参数的请求时,服务器端可能无法正确解析中文字符。

解决方案是在服务器端对请求参数进行解码。

可以通过在Tomcat的server.xml中配置URIEncoding属性来确保正确的解码,例如将URIEncoding 设为"UTF-8"。

2. 数据库中的中文乱码:当我们将中文数据存储到数据库中时,如果数据库的字符编码与传入的数据的字符编码不一致,就会出现中文乱码。

解决方案是在创建数据库表时指定正确的字符编码,并在连接数据库时设置正确的连接字符编码。

可以在创建数据库表时指定字符集为utf8mb4,然后在连接MySQL数据库时将连接字符集设为utf8mb4。

3. 页面展示中的中文乱码:在JSP页面中,如果不指定正确的字符编码,就可能出现中文乱码。

解决方案是在JSP页面的头部指定正确的字符编码,例如设置contentType为"text/html; charset=UTF-8"。

4. 中文文件名的乱码:当我们下载一个中文文件时,浏览器可能无法正确解析中文文件名,导致乱码。

解决方案是通过在响应的header中设置Content-Disposition属性来指定正确的文件名编码。

可以将Content-Disposition的值设置为"attachment; filename*=utf-8''文件名",其中文件名是经过URL编码的。

6. 处理中文乱码的过滤器:为了统一处理中文乱码问题,可以在项目中添加一个字符编码过滤器,将所有的请求和响应的字符编码都统一为UTF-8。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策随着互联网的发展,Java Web项目的开发越来越受到关注和重视。

在实际的项目开发过程中,中文乱码问题时常出现,给开发人员带来了不少麻烦。

本文将探讨Java Web项目开发中的中文乱码问题及对策,帮助开发人员更好地解决这一问题。

一、中文乱码问题的产生原因1. 默认编码设置不一致:在Java Web项目中通常会涉及到多个组件之间的数据传输,比如数据库、前端页面、服务器端等。

如果这些组件的默认编码设置不一致,就会导致中文乱码问题的发生。

2. 数据库编码设置不正确:在数据库中存储和读取中文数据时,如果数据库的编码设置不正确,也会导致中文乱码问题。

3. 页面编码设置不正确:在前端页面中,如果页面的编码设置不正确,就会导致显示中文乱码。

4. 服务器编码设置不正确:在服务器端程序中,如果编码设置不正确,也会导致中文乱码问题的发生。

二、中文乱码问题的解决对策1. 统一编码设置:在Java Web项目开发中,要尽量统一各个组件的编码设置,确保它们之间的数据传输不会产生乱码。

建议使用UTF-8编码,因为UTF-8是一种能够表示世界上所有字符的编码,通用性很强。

2. 数据库编码设置:对于数据库编码设置不正确的问题,可以通过修改数据库的编码方式来解决。

将数据库的编码方式设置为UTF-8,以确保能够正确地存储和读取中文数据。

3. 页面编码设置:在前端页面中,要确保页面的编码设置正确。

通常可以在<head>标签中添加<meta charset="UTF-8">来指定页面的编码方式为UTF-8,以确保页面能够正确显示中文内容。

4. 服务器编码设置:在服务器端程序中,要确保编码设置正确。

在Tomcat等服务器中,可以在server.xml配置文件中添加URIEncoding="UTF-8"来指定编码方式为UTF-8。

如何解决Java中中文乱码问题

如何解决Java中中文乱码问题

如何解决Java中的中文乱码问题?一、中文问题的来源计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理。

随着计算机的开展,为了适应世界其它民族的语言〔当然包括我们的汉字〕,人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统〔多数时间是操作系统〕默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持的格式显示出来。

Java的JDK和JVM即是如此,我这里说的JDK是指国际版的JDK,我们大多数程序员使用的是国际化的JDK版本,以下所有的JDK均指国际化的JDK版本。

我们的汉字是双字节编码语言,为了能让计算机处理中文,我们自己制定的gb2312、GBK、GBK2K等标准以适应计算机处理的需求。

所以,大局部的操作系统为了适应我们处理中文的需求,均定制有中文操作系统,它们采用的是GBK,GB2312编码格式以正确显示我们的汉字。

如:中文Win2K默认采用的是GBK编码显示,在中文WIN2k中保存文件时默认采用的保存文件的编码格式也是GBK的,即,所有在中文WIN2K中保存的文件它的内部编码默认均采用GBK编码,注意:GBK是在GB2312根底上扩充来的。

1由于Java语言内部采用UNICODE编码,所以在JAVA程序运行时,就存在着一个从UNICODE编码和对应的操作系统及浏览器支持的编码格式转换输入、输出的问题,这个转换过程有着一系列的步骤,如果其中任何一步出错,那么显示出来的汉字就会出是乱码,这就是我们常见的JAVA中文问题。

同时,Java是一个跨平台的编程语言,也即我们编写的程序不仅能在中文windows上运行,也能在中文Linux等系统上运行,同时也要求能在英文等系统上运行〔我们经常看到有人把在中文win2k上编写的JAVA程序,移植到英文Linux上运行〕。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策【摘要】在Java Web项目开发中,中文乱码问题一直是开发者们头痛的难题。

本文旨在探讨中文乱码问题的原因及解决方案。

通过分析中文乱码问题的根源,可以明确乱码产生的原因。

探讨了在Java Web项目中如何正确设置字符编码以避免乱码问题的发生。

介绍了使用过滤器处理乱码的方法,通过过滤器可以有效地解决乱码问题。

本文通过对中文乱码问题的分析和解决方案提出了一些有效的对策,希望能够帮助开发者更好地处理中文乱码问题。

展望未来,我们可以进一步研究和优化解决方案,以提升中文乱码问题的处理效率和准确性。

【关键词】Java Web项目开发、中文乱码问题、对策、引言、背景介绍、研究目的、正文、乱码问题分析、乱码原因分析、解决方案探讨、字符编码设置、使用过滤器处理乱码、结论、总结分析、展望未来。

1. 引言1.1 背景介绍在Java Web项目开发中,中文乱码问题一直是开发者们头疼的难题。

随着中文内容在互联网中的普及和应用不断增加,中文乱码问题也变得越发严重。

由于在网络传输过程中,数据的编码格式可能会发生变化,导致中文字符显示时出现乱码现象。

这给用户的浏览体验造成了影响,也给开发人员带来了困扰。

为了更好地解决Java Web项目开发中的中文乱码问题,本文旨在对中文乱码问题进行深入分析,并探讨解决方案。

首先我们将分析中文乱码问题出现的原因,进一步讨论乱码问题的解决方案。

在具体实践中,我们将重点讨论字符编码设置和使用过滤器处理乱码的方法,希望为开发者们提供实用的技术指导。

通过本文的研究和探讨,希望能够为Java Web项目开发中的中文乱码问题提供有效的解决方案,提升项目的稳定性和用户体验,为开发者们的工作带来便利。

1.2 研究目的研究目的是为了解决Java Web项目开发中出现的中文乱码问题,提高系统的稳定性和用户体验。

通过深入分析中文乱码问题的原因,探讨相关的解决方案,并探讨如何正确设置字符编码以及使用过滤器来处理乱码,最终达到消除乱码问题的目的。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策随着互联网的发展,Java Web项目开发在国内已经成为一种非常常见的开发方式,这也使得在Java Web项目开发中出现了大量的中文乱码问题。

中文乱码问题不仅给用户带来了不便,更影响了网站的形象和用户体验。

在Java Web项目开发中,针对中文乱码问题需要采取相应的对策,保证网站文本内容的正常显示。

本文将就Java Web项目开发中的中文乱码问题进行详细探讨,并提出相应的对策,希望对读者有所帮助。

一、中文乱码问题的原因及表现1.1 原因在Java Web项目开发中,中文乱码问题通常是由于字符编码不统一所导致的。

在不同的环境下,对中文字符的编码方式可能会有所不同,如果在处理数据时没有统一的字符编码方式,就会导致中文乱码问题的产生。

1.2 表现在Java Web项目开发中,中文乱码问题通常会表现为网页上的中文文字显示为乱码、输入的中文文字在数据库中保存为乱码等情况。

这会导致网页内容无法正常显示,用户无法正确阅读信息,给网站带来了不良影响。

二、解决中文乱码问题的对策2.1 统一字符编码方式为了解决中文乱码问题,Java Web项目开发中首先需要统一字符编码方式。

通常情况下,使用UTF-8编码是最为推荐的方式,因为UTF-8编码能够支持全球范围内的所有字符,能够有效避免中文乱码问题的发生。

在Java Web项目开发中,开发人员应该统一使用UTF-8编码,包括数据库连接、文件读写、网页输出等各个环节。

2.2 设置响应头在Java Web项目开发中,为了确保网页能够正确显示中文内容,开发人员还需要在网页的响应头中设置字符编码。

这可以通过在网页的<head>标签中添加meta标签来实现,例如:```html<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">```这样可以告诉浏览器使用UTF-8编码来解析网页内容,从而避免中文乱码问题的发生。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策一、中文乱码问题的原因中文乱码问题在Java Web项目开发中往往是由于编码格式不统一所导致的。

在Java 中,常见的编码格式包括GBK、UTF-8等,而在Web项目中,前端页面、数据库、Java代码等部分可能使用不同的编码格式,当它们之间出现不一致时就会导致中文乱码问题的发生。

具体来说,中文乱码问题可能出现在以下几个方面:1. 前端页面的编码格式与后端编码格式不一致;2. 请求数据的编码格式与后端处理编码格式不一致;3. 数据库表字段的编码格式与Java代码读取编码格式不一致;4. 文本文件或配置文件的编码格式与Java代码读取编码格式不一致。

中文乱码问题的存在会严重影响用户体验和数据准确性,给Web项目带来一系列不良后果。

具体表现为:1. 用户提交的中文数据在系统中出现乱码,降低了系统的可读性和友好性;2. 保存到数据库中的中文数据乱码,影响了数据的准确性和可用性;3. 在后台系统中处理中文数据时出现乱码,可能导致错误的逻辑判断和处理结果;4. 在导出文本文件或配置文件时出现乱码,影响了文件的可用性和可读性。

针对中文乱码问题,我们可以采取一些对策来预防和解决这一问题,从而提升Web项目的质量和稳定性。

1. 统一编码格式在Web项目中,应尽量统一使用UTF-8编码格式,包括前端页面、请求数据、后端处理和数据库存储等部分。

这样可以避免不同编码格式之间的兼容性问题,减少中文乱码问题的发生。

2. 前端页面设置编码在前端页面的<head>标签中添加<meta charset="UTF-8">,以确保前端页面以UTF-8编码格式进行显示和提交数据。

3. 请求数据编码设置在后端处理请求数据时,需要明确指定请求数据的编码格式,可以通过设置HttpServletRequest.setCharacterEncoding("UTF-8")来确保请求数据按照UTF-8格式进行处理。

Java编程技术中汉字问题

Java编程技术中汉字问题

中文编码的处理每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码, 中国的GB2312-80,日本的JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。

字符编码集按长度分为SBCS(单字节字符集),DBCS(双字节字符集)两大类。

早期的软件(尤其是操作系统),为了解决本地字符信息的计算机处理,出现了各种本地化版本(L10N),为了区分,引进了LANG, Codepage 等概念。

但是由于各个本地字符集代码范围重叠,相互间信息交换困难;软件各个本地化版本独立维护成本较高。

因此有必要将本地化工作中的共性抽取出来,作一致处理,将特别的本地化处理内容降低到最少。

这也就是所谓的国际化(I18N)。

各种语言信息被进一步规范为Locale 信息。

处理的底层字符集变成了几乎包含了所有字形的Unicode。

现在大部分具有国际化特征的软件核心字符处理都是以Unicode 为基础的,在软件运行时根据当时的Locale/Lang/Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符。

在处理过程中需要实现Unicode 和本地字符集的相互转换,甚或以Unicode 为中间的两个不同本地字符集的相互转换。

这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容。

Java 语言内部是用Unicode 表示字符的,遵守Unicode V2.0。

Java 程序无论是从/往文件系统以字符流读/写文件,还是往URL 连接写HTML 信息,或从URL 连接读取参数值,都会有字符编码的转换。

这样做虽然增加了编程的复杂度,容易引起混淆,但却是符合国际化的思想的。

从理论上来说,这些根据字符集设置而进行的字符转换不应该产生太多问题。

而事实是由于应用程序的实际运行环境不同,Unicode 和各个本地字符集的补充、完善,以及系统或应用程序实现的不规范,转码时出现的问题时时困扰着程序员和用户。

Java编程技术中汉字问题的分析及解决

Java编程技术中汉字问题的分析及解决

Java 编程技术中汉字问题的分析及解决段明辉自由撰稿人2000 年 11月8日在基于 Java 语言的编程中我们经常碰到汉字的处理及显示的问题一大堆看不懂的乱码肯定不是我们愿意看到的显示效果怎样才能够让那些汉字正确显示呢Java 语言默认的编码方式是UNICODE 而我们中国人通常使用的文件和数据库都是基于 GB2312 或者 BIG5 等方式编码的怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢本文将从汉字编码的常识入手结合 Java 编程实例分析以上两个问题并提出解决它们的方案现在 Java 编程语言已经广泛应用于互联网世界早在 Sun 公司开发 Java 语言的时候就已经考虑到对非英文字符的支持了Sun 公司公布的 Java 运行环境JRE本身就分英文版和国际版但只有国际版才支持非英文字符不过在 Java 编程语言的应用中对中文字符的支持并非如同 Java Soft 的标准规范中所宣称的那样完美因为中文字符集不只一个而且不同的操作系统对中文字符的支持也不尽相同所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们有很多关于这些问题的解答但都比较琐碎并不能够满足大家迫切解决问题的愿望关于 Java 中文问题的系统研究并不多本文从汉字编码常识出发分析 Java 中文问题希望对大家解决这个问题有所帮助汉字编码的常识我们知道英文字符一般是以一个字节来表示的最常用的编码方法是 ASCII 但一个字节最多只能区分256个字符而汉字成千上万所以现在都以双字节来表示汉字为了能够与英文字符分开每个字节的最高位一定为1这样双字节最多可以表示64K格字符我们经常碰到的编码方式有 GB2312 BIG5UNICODE 等关于具体编码方式的详细资料有兴趣的读者可以查阅相关资料我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE GB2312 码中华人民共和国国家标准汉字信息交换用编码是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码通行于中国大陆地区及新加坡简称国标码两个字节中第一个字节高字节的值为区号值加3220H第二个字节低字节的值为位号值加3220H用这两个值来表示一个汉字的编码UNICODE 码是微软提出的解决多国字符问题的多字节等长编码它对英文字符采取前面加0字节的策略实现等长兼容如A的 ASCII 码为0x41UNICODE 就为0x000x41利用特殊的工具各种编码之间可以互相转换Java 中文问题的初步认识我们基于 Java 编程语言进行应用开发时不可避免地要处理中文Java 编程语言默认的编码方式是 UNICODE而我们通常使用的数据库及文件都是基于 GB2312 编码的我们经常碰到这样的情况浏览基于 JSP 技术的网站看到的是乱码文件打开后看到的也是乱码被 Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息String sEnglish = “apple”;String sChinese = “苹果”;String s = “苹果 apple ”;sEnglish 的长度是5sChinese的长度是4而 s 默认的长度是14对于 sEnglish来说 Java 中的各个类都支持得非常好肯定能够正确显示但对于 sChinese 和 s 来说虽然 Java Soft 声明 Java 的基本类已经考虑到对多国字符的支持默认 UNICODE 编码但是如果操作系统的默认编码不是UNICODE 而是国标码等从 Java 源代码到得到正确的结果要经过Java 源代码-> Java 字节码-> ;虚拟机->操作系统->显示设备的过程在上述过程中的每一步骤我们都必须正确地处理汉字的编码才能够使最终的显示结果正确Java 源代码-> Java 字节码标准的 Java 编译器 javac 使用的字符集是系统默认的字符集比如在中文 Windows 操作系统上就是 GBK ,而在 Linux 操作系统上就是ISO-8859-1所以大家会发现在 Linux 操作系统上编译的类中源文件中的中文字符都出了问题解决的办法就是在编译的时候添加encoding 参数这样才能够与平台无关用法是javac –encoding GBKJava 字节码->虚拟机->操作系统 Java 运行环境JRE分英文版和国际版但只有国际版才支持非英文字符 Java 开发工具包JDK肯定支持多国字符但并非所有的计算机用户都安装了 JDK 很多操作系统及应用软件为了能够更好的支持 Java 都内嵌了 JRE 的国际版本为自己支持多国字符提供了方便操作系统->显示设备对于汉字来说操作系统必须支持并能够显示它英文操作系统如果不搭配特殊的应用软件的话是肯定不能够显示中文的还有一个问题就是在 Java 编程过程中对中文字符进行正确的编码转换例如向网页输出中文字符串的时候不论你是用是含中文的字符串stringout.println(string); //还是用<%=string%>都必须作 UNICODE 到 GBK 的转换或者手动或者自动在 JSP 1.0中可以定义输出字符集从而实现内码的自动转换用法是<%@page ContentType=”text/html;charset=gb2312” %>但是在一些 JSP 版本中并没有提供对输出字符集的支持例如 JSP 0.92这就需要手动编码输出了方法非常多最常用的方法是String s1 = request.getParameter(“keyword”);String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);getBytes 方法用于将中文字符以ISO-8859-1编码方式转化成字节数组而GBK是目标编码方式我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 经过上述转换过程在支持 GBK 字符集的操作系统和应用软件中就能够正确显示中文字符串 s2Java 中文问题的表层分析及处理背景开发环境JDK1.15 Vcafe2.0 JPadPro服务器端NT IIS Sybase System Jconnect JDBC客户端IE5.0 Pwin98.CLASS 文件存放在服务器端由客户端的浏览器运行 APPLET APPLET 只起调入 FRAME 类等主程序的作用界面包括 Textfield TextArea List Choice 等I.取中文用 JDBC 执行 SELECT 语句从服务器端读取数据中文后将数据用 APPEND 方法加到 TextArea TA不能正确显示但加到 List 中时大部分汉字却可正确显示将数据按ISO-8859-1编码方式转化为字节数组再按系统缺省编码方式Default CharacterEncoding转化为 STRING 即可在 TA 和 List 中正确显示程序段如下dbstr2 = results.getString(1);//After reading the result from DB server converting it to string.dbbyte1 = dbstr2.getBytes(“iso-8859-1”);dbstr1 = new String(dbbyte1);在转换字符串时不采用系统默认编码方式而直接采用 GBK或者GB2312,在 A 和 B 两种情况下从数据库取数据都没有问题II.写中文到数据库处理方式与取中文相逆先将 SQL 语句按系统缺省编码方式转化为字节数组再按ISO-8859-1编码方式转化为 STRING 最后送去执行则中文信息可正确写入数据库程序段如下sqlstmt = tf_input.getText();//Before sending statement to DB server converting it to sql statement.dbbyte1 = sqlstmt.getBytes();sqlstmt = newString(dbbyte1,”iso-8859-1”);_stmt = _con.createStatement();_stmt.executeUpdate(sqlstmt);问题如果客户机上存在 CLASSPATH 指向 JDK 的 CLASSES.ZIP 时称为 A 情况上述程序代码可正确执行但是如果客户机只有浏览器而没有 JDK 和 CLASSPATH 时称为 B 情况则汉字无法正确转换我们的分析1.经过测试在 A 情况下程序运行时系统的缺省编码方式为 GBK 或者 GB2312 在 B 情况下程序启动时浏览器的JA V A 控制台中出现如下错误信息Can't find resource for sun.awt.windows.awtLocalization_zh_CN然后系统的缺省编码方式为8859-12.如果在转换字符串时不采用系统缺省编码方式而是直接采用GBK或GB2312则在 A 情况下程序仍然可正常运行在 B 情况下系统出现错误UnsupportedEncodingException3.在客户机上把 JDK 的 CLASSES.ZIP 解压后放在另一个目录中 CLASSPATH 只包含该目录然后一边逐步删除该目录中的 .CLASS 文件另一边运行测试程序最后发现在一千多个 CLASS 文件中只有一个是必不可少的该文件是sun.io.CharToByteDoubleByte.class将该文件拷到服务器端和其它的类放在一起并在程序的开头 IMPORT 它在 B 情况下程序仍然无法正常运行4.在 A 情况下如果在 CLASSPTH 中去掉 sun.io.CharToByteDoubleByte.class 则程序运行时测得默认编码方式为8859-1否则为GBK或GB2312如果 JDK 的版本为1.2以上的话在 B 情况下遇到的问题得到了很好的解决测试的步骤同上有兴趣的读者可以尝试一下Java 中文问题的根源分析及解决在简体中文MS Windows 98 + JDK 1.3 下可以用 System.getProperties() 得到 Java 运行环境的一些基本属性类 PoorChinese 可以帮助我们得到这些属性类 PoorChinese 的源代码public class PoorChinese {public static void main(String[] args) {System.getProperties().list(System.out);}}执行 java PoorChinese 后我们会得到:系统变量 file.encoding 的值为 GBK nguage 的值为 zh user.region 的值为 CN 这些系统变量的值决定了系统默认的编码方式是 GBK在上述系统中下面的代码将 GB2312 文件转换成 Big5 文件它们能够帮助我们理解 Java 中汉字编码的转化:import java.io.*;import java.util.*;public class gb2big5 {static int iCharNum=0;public static void main(String[] args) {System.out.println("Input GB2312 file, output Big5 file.");if (args.length!=2) {System.err.println("Usage: jview gb2big5 gbfile big5file");System.exit(1);}String inputString = readInput(args[0]);writeOutput(inputString,args[1]);System.out.println("Number of Characters in file: "+iCharNum+"."); }static void writeOutput(String str, String strOutFile) {try {FileOutputStream fos = new FileOutputStream(strOutFile);Writer out = new OutputStreamWriter(fos, "Big5");out.write(str);}catch (IOException e) {e.printStackTrace();e.printStackTrace();}}static String readInput(String strInFile) {StringBuffer buffer = new StringBuffer();try {FileInputStream fis = new FileInputStream(strInFile);InputStreamReader isr = new InputStreamReader(fis, "GB2312");Reader in = new BufferedReader(isr);int ch;while ((ch = in.read()) > -1) {iCharNum += 1;buffer.append((char)ch);}return buffer.toString();}catch (IOException e) {e.printStackTrace();return null;}}}编码转化的过程如下ByteToCharGB2312 CharToByteBig5GB2312------------------>Unicode------------->Big5执行java gb2big5 gb.txt big5.txt 如果 gb.txt 的内容是今天星期三则得到的文件 big5.txt 中的字符能够正确显示而如果 gb.txt 的内容是情人节快乐则得到的文件 big5.txt 中对应于节和乐的字符都是符号0x3F可见 sun.io.ByteToCharGB2312 和 sun.io.CharToByteBig5 这两个基本类并没有编好正如上例一样 Java 的基本类也可能存在问题由于国际化的工作并不是在国内完成的所以在这些基本类发布之前没有经过严格的测试所以对中文字符的支持并不像 Java Soft 所声称的那样完美前不久我的一位技术上的朋友发信给我说他终于找到了 Java Servlet 中文问题的根源两周以来他一直为 Java Servlet 的中文问题所困扰因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果这好象是大家公认的唯一的解决办法后来他确实不想如此继续安分下去了因为这样的事情确实不应该是高级程序员所要做的工作他就找出 Servlet 解码的源代码进行分析因为他怀疑问题就出在解码这部分经过四个小时的奋斗他终于找到了问题的根源所在原来他的怀疑是正确的 Servlet 的解码部分完全没有考虑双字节直接把 %XX 当作一个字符原来 Java Soft 也会犯这幺低级的错误如果你对这个问题有兴趣或者遇到了同样的烦恼的话你可以按照他的步骤对 Servlet.jar 进行修改找到源代码 HttpUtils 中的static private String parseName 在返回前将 sb StringBuffer复制成byte bs[] 然后return new String(bs,”GB2312”)作上述修改后就需要自己解码了HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者form=HttpUtils.parsePostData(……)千万别忘了编译后放到 Servlet.jar 里面五关于 Java 中文问题的总结Java 编程语言成长于网络世界这就要求 Java 对多国字符有很好的支持 Java 编程语言适应了计算的网络化的需求为它能够在网络世界迅速成长奠定了坚实的基础 Java 的缔造者Java Soft已经考虑到 Java 编程语言对多国字符的支持只是现在的解决方案有很多缺陷在里面需要我们付诸一些补偿性的措施而世界标准化组织也在努力把人类所有的文字统一在一种编码之中其中一种方案是ISO10646 它用四个字节来表示一个字符当然在这种方案未被采用之前还是希望 Java Soft 能够严格地测试它的产品为用户带来更多的方便附一个用于从数据库和网络中取出中文乱码的处理函数入参是有问题的字符串出参是问题已经解决了的字符串String parseChinese(String in){String s =null;byte temp [];if (in == null){System.out.println("Warn:Chinese null founded!");return new String("");}try{temp=in.getBytes("iso-8859-1");temp=in.getBytes("iso-8859-1");s = new String(temp);}{System.out.println("Warn:Chinese null founded!");return new String("");}try{temp=in.getBytes("iso-8859-1");s = new String(temp);}catch(UnsupportedEncodingException e){System.out.println (e.toString());}return s;}参考资料• BBS 水木清华站的 Java 讨论区o 中国最大的电子公告板的 Java 讨论区有众多高校的 Java 爱好者在此进行关于 Java 技术的讨论作者简介• 段明辉清华大学电子工程系学生o 现在正在清华大学微电子学研究所从事 Java 智能卡微处理器的研究和开发o 领导 BBS 水木清华站的 Java 讨论组为众多 Java 技术应用者提供解决方案。

Java编程中中文乱码问题的研究及解决方案

Java编程中中文乱码问题的研究及解决方案

Java编程中中文乱码问题的研究及解决方案0 引言Java最大的特性是与平台的无关性及开发环境的多样性。

字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码。

Java语言内部采用Unicode编码,它是定长双字节编码,即任何符号都用两个字节表示。

在Java程序运行时,就有一个从Unicode编码到对应操作系统及浏览器支持的编码格式转换问题,若此过程有一步不对就会出现中文乱码的问题。

1 Java Web开发中文乱码问题及解决方法出现乱码三种主要情况是:页面显示乱码、用户提交的数据是乱码、数据库中的数据是乱码。

下面就这三种情况讨论其解决的方案,其支持的环境是J2EE5.0,服务器为Tomcat5.5.16,数据库为MYSQL5.0。

1.1 页面显示乱码页面上显示乱码的现象是:当访问某个JSP或者Servlet产生的页面的时候,页面上本来应该显示中文信息的地方变成乱码。

这时首先要分析乱码的来源。

乱码的来源可能有两种情况,一种是浏览器显示不正确,另一种情况是后台在动态生成页面的时候,其内容就是乱码。

所以,首先要做的是查看页面的源文件,看看里面的中文到底是不是乱码。

如果不是乱码,那么说明是浏览器没有正确地解析页面的编码,否则是由于后台处理造成的。

对于第一种情况,只需要设置JSP或者Servlet的contentType属性即可。

对于JSP 中的设置使用的是page指令,将其代码设置为:对于Servlet生成的页面,需要在输出页面之前调用response的setContentType()方法。

其代码形式如下:response.setContentType("text/html;charset=gb2312");另外,在所生成的HTML文件的头部最好加入下面的内容:若页面本身的内容就是乱码这种情况,一般只出现在动态生成内容的那一部分。

要通过源代码进一步地查找乱码产生的根源。

这时数据的来源也有两种情况,一种是从数据库中取出来的数据,另一种是接收的来自页面提交的数据。

javac编译中文异常解决方法

javac编译中文异常解决方法

javac编译中文异常解决方法如何解决在javac编译过程中出现的中文异常问题。

在日常的Java开发中,我们经常会遇到一些中文异常问题。

这些问题可能是因为源代码中包含了中文字符,而编译器无法正确处理中文字符所导致的。

为了解决这个问题,我们需要采取一些措施来确保编译过程中不会出现中文异常。

本文将一步一步地回答如何解决这个问题。

第一步:了解中文字符在编译过程中的问题在Java中,标识符(如变量名、方法名等)是由字母、数字、下划线和美元符号组成的。

然而,标准的ASCII字符集只包含了英文字母,这就意味着Java编译器无法处理非ASCII字符,比如中文字符。

所以,如果我们的源代码包含了中文字符,编译器就会报错。

第二步:使用正确的字符编码编码是将字符转换为字节的过程。

在Java中,源代码和编译后的字节码都需要使用正确的字符编码。

Unicode是一种表示所有字符的标准编码方式,它支持全球范围内的所有字符。

通常情况下,我们使用UTF-8或UTF-16编码来处理中文字符。

UTF-8是一种变长的编码方式,可以表示任意Unicode字符。

它使用1到4个字节来表示一个字符,其中常用的ASCII字符只需要1个字节。

UTF-16是一种固定长度的编码方式,其中每个字符都使用2个字节表示。

这两种编码方式都可以正确处理中文字符,但在不同的场景下可能会有不同的需求。

为了在编译过程中正确处理中文字符,我们需要在源代码中指定正确的字符编码方式。

通常情况下,我们可以在源代码的开头添加以下注释来指定字符编码方式:-*- coding: utf-8 -*-这个注释告诉Java编译器,源代码使用UTF-8编码。

如果我们使用了其他编码方式,只需将utf-8替换为相应的编码方式即可。

第三步:选择合适的IDEIDE(Integrated Development Environment,集成开发环境)是编写和编译代码的工具。

不同的IDE对中文字符的处理方式可能有所不同。

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策

Java Web项目开发中的中文乱码问题与对策在Java Web项目开发中,遇到中文乱码问题是比较常见的。

中文乱码问题的根本原因是Java中使用的是Unicode编码,而在HTTP传输过程中使用的是ISO-8859-1编码,这两种编码不兼容,导致中文字符无法正确显示。

中文乱码问题通常会出现在以下几个方面:1. 数据库存储:如果数据库的字段类型是varchar而不是utf8类型,就无法正确存储中文字符,导致乱码问题。

解决办法是将数据库的字段类型修改为utf8。

2. 请求参数传递:如果浏览器向服务器发送的请求参数中包含中文字符,而服务器没有正确解析编码,就会导致中文字符乱码。

解决办法是在服务器端对请求参数进行编码转换,通常使用的是UTF-8编码。

3. 响应结果显示:如果服务器向浏览器返回的响应结果中包含中文字符,而没有正确设置响应头的编码,浏览器无法正确解析中文字符,就会显示乱码。

解决办法是在服务器端设置响应头的Content-Type为text/html;charset=UTF-8。

针对中文乱码问题,我们可以采取以下对策:1. 统一字符编码:在整个项目中都使用UTF-8编码,包括数据库、服务器、浏览器等各个环节,确保数据的正确传输和显示。

2. 在项目中添加字符编码过滤器:通过在web.xml文件中配置字符编码过滤器,可以对请求和响应的字符编码进行统一处理,确保中文字符能够正确传输和显示。

5. 在文件上传和下载时进行编码转换:在上传和下载文件时,对文件名进行编码转换,通常使用的是URL编码,确保文件名中的中文字符能够正确传输和显示。

遇到中文乱码问题时,需要在不同的环节进行编码转换和设置,确保中文字符能够正确传输和显示。

通过统一字符编码、设置响应头的字符编码、对请求参数进行编码转换等对策,可以有效解决中文乱码问题,提高项目的可用性和用户体验。

Java编程中中文问题的产生及其解决方案

Java编程中中文问题的产生及其解决方案

Java 编程中中文问题的产生及其解决方案刘冰(四川达州职业技术学院信息工程系,达州635001)关键词:编码;解码;乱码;Unicode ;JVM ;GBK收稿日期:2010-02-04修稿日期:2010-03-01作者简介:刘冰(1970-),男,四川达县人,讲师,本科,研究方向为计算机软件技术在深入分析Java 程序设计中Java 编译器对Java 源文件和JVM 对class 文件的编码/解码过程的基础上,分析Java 编程中中文问题产生的根本原因,同时给出常见的Java 程序在解决中文乱码方面的建议解决方案。

引言在进行中文环境的Java 应用的开发当中,由于Java 技术本身的缺陷,稍有不慎就会碰到在例如运行Java 程序、程序移植或者Java 程序与其他媒介进行含有中文字符信息的交互等方面出现中文乱码的情况,其主要表现在中文字符串无法正确显示。

由于环境的不同,其表现情况也不尽相同,例如:Web 应用中的JSP 文件中的中文字符无法正确显示,出现类似于拉丁字母的乱码;在通过JSP 文件传输的中文参数无法正确显示,显示为“?”;在将中文数据存入数据库之后,再读出时显示为“?”,等等。

这些情况随着环境的不同而变化,相同的程序在不同的环境下有时也会出现这些问题。

1问题的产生众所周知,现在市场上许多的软件内部均是采用Unicode 格式的编码,而本地系统默认支持的却可能是其他的编码格式(例如Windows 中文系统是GBK ,而Linux 系统通常支持ISO8859-l ),这就使得它在运行时需要进行二者间的转换,或者以Unicode 为中介实现两个不同本地字符集的转换工作。

Java 语言内部使用的是Unicode 编码格式,在中文操作系统(例如Windows 系统)的背境下,要想使得Java 程序里出现的中文字符能够正确显示出来,就需要保证输入和输出的编码格式一致,即在“Java 源代码—Java 字节码—虚拟机(JVM )—操作系统—显示设备”中的每一步都必须正确地处理中文的编码。

Unicode_JAVA开发常见中文问题解决方法汇总

Unicode_JAVA开发常见中文问题解决方法汇总

JA V A开发常见中文问题解决方法汇总在Java开发中常见的中文问题主要有以下几种:一、JSP页面显示乱码二、JSP、Servlet表单提交中文时出现乱码三、连接数据库操作乱码//原因:服务器使用的编码方式不同和浏览器对不同的字符显示结果不同而导致的。

1、页面编码不一致导致的乱码:对不同的WEB服务器和不同的JDK版本,处理结果可能会不一样。

注意:以UTF-8编码存储的文件被解码为ISO8859-1。

解决办法:在JSP页面中指定编码方式(GBK|GB2312|UTF-8),即在页面的第一行加上:<%@ page contentType="text/html; charset= GBK|GB2312|UTF-8"%>,就可以消除乱码了。

2、JSP中include静态HTML文件时出现乱码解决办法:在web.xml文件中加入以下配置。

<jsp-config><jsp-property-group><description> JSP example.</description><display-name>JSPConfiguration</display-name><url-pattern>*.jsp</url-pattern><el-ignored>true</el-ignored><page-encoding>GB2312</page-encoding><scripting-invalid>false</scripting-invalid><include-prelude></include-prelude><include-coda></include-coda><description> JSP example</description><display-name>JSPConfiguration</display-name><url-pattern>*.html</url-pattern><el-ignored>true</el-ignored><page-encoding>GB2312</page-encoding><scripting-invalid>false</scripting-invalid><include-prelude></include-prelude><include-coda></include-coda></jsp-property-group></jsp-config>3、表单提交中文时出现乱码(分get和post两种处理)主要是由于浏览器默认使用UTF-8编码方式来发送请求,而UTF- 8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在基于Java 语言的编程中,我们经常碰到汉字的处理及显示的问题。

一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Java语言默认的编码方式是UNICODE,而我们中国人通常使用的文件和数据库都是基于GB2312或者BIG5等方式编码的,怎样才能够恰当地选择汉字编码方式并正确地处理汉字的编码呢?本文将从汉字编码的常识入手,结合Java编程实例,分析以上两个问题并提出解决它们的方案。

现在Java 编程语言已经广泛应用于互联网世界,早在Sun 公司开发Java 语言的时候,就已经考虑到对非英文字符的支持了。

Sun 公司公布的Java 运行环境(JRE)本身就分英文版和国际版,但只有国际版才支持非英文字符。

不过在Java 编程语言的应用中,对中文字符的支持并非如同Java Soft 的标准规范中所宣称的那样完美,因为中文字符集不只一个,而且不同的操作系统对中文字符的支持也不尽相同,所以会有许多和汉字编码处理有关的问题在我们进行应用开发中困扰着我们。

有很多关于这些问题的解答,但都比较琐碎,并不能够满足大家迫切解决问题的愿望,关于Java 中文问题的系统研究并不多,本文从汉字编码常识出发,分析Java 中文问题,希望对大家解决这个问题有所帮助。

汉字编码的常识我们知道,英文字符一般是以一个字节来表示的,最常用的编码方法是ASCII 。

但一个字节最多只能区分256个字符,而汉字成千上万,所以现在都以双字节来表示汉字,为了能够与英文字符分开,每个字节的最高位一定为1,这样双字节最多可以表示64K格字符。

我们经常碰到的编码方式有GB2312、BIG5、UNICODE等。

关于具体编码方式的详细资料,有兴趣的读者可以查阅相关资料。

我肤浅谈一下和我们关系密切的GB2312 和UNICODE。

GB2312 码,中华人民共和国国家标准汉字信息交换用编码,是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码,通行于中国大陆地区及新加坡,简称国标码。

两个字节中,第一个字节(高字节)的值为区号值加32(20H),第二个字节(低字节)的值为位号值加32(20H),用这两个值来表示一个汉字的编码。

UNICODE 码是微软提出的解决多国字符问题的多字节等长编码,它对英文字符采取前面加“0”字节的策略实现等长兼容。

如“A” 的ASCII 码为0x41,UNICODE就为0x00,0x41。

利用特殊的工具各种编码之间可以互相转换。

回页首Java 中文问题的初步认识我们基于Java 编程语言进行应用开发时,不可避免地要处理中文。

Java 编程语言默认的编码方式是UNICODE,而我们通常使用的数据库及文件都是基于GB2312 编码的,我们经常碰到这样的情况:浏览基于JSP技术的网站看到的是乱码,文件打开后看到的也是乱码,被Java 修改过的数据库的内容在别的场合应用时无法继续正确地提供信息。

String sE nglish = “apple”;String sChinese = “苹果”;String s = “苹果apple ”;sE nglish 的长度是5,sChinese的长度是4,而s 默认的长度是14。

对于sE nglish来说,Java 中的各个类都支持得非常好,肯定能够正确显示。

但对于sChinese 和s 来说,虽然Java Soft 声明Java 的基本类已经考虑到对多国字符的支持(默认UNICODE编码),但是如果操作系统的默认编码不是UNICODE,而是国标码等。

从Java 源代码到得到正确的结果,要经过“Java 源代码-> Java 字节码-> ;虚拟机->操作系统->显示设备”的过程。

在上述过程中的每一步骤,我们都必须正确地处理汉字的编码,才能够使最终的显示结果正确。

“ Java 源代码-> Java 字节码”,标准的Java 编译器javac 使用的字符集是系统默认的字符集,比如在中文Windows 操作系统上就是GBK ,而在Linux 操作系统上就是ISO-8859-1,所以大家会发现在Linux 操作系统上编译的类中源文件中的中文字符都出了问题,解决的办法就是在编译的时候添加encoding 参数,这样才能够与平台无关。

用法是javac ?Cencoding GBK。

“ Java 字节码->虚拟机->操作系统”,Java 运行环境(JRE)分英文版和国际版,但只有国际版才支持非英文字符。

Java 开发工具包(JDK)肯定支持多国字符,但并非所有的计算机用户都安装了JDK 。

很多操作系统及应用软件为了能够更好的支持Java ,都内嵌了JRE 的国际版本,为自己支持多国字符提供了方便。

“操作系统->显示设备”,对于汉字来说,操作系统必须支持并能够显示它。

英文操作系统如果不搭配特殊的应用软件的话,是肯定不能够显示中文的。

还有一个问题,就是在Java 编程过程中,对中文字符进行正确的编码转换。

例如,向网页输出中文字符串的时候,不论你是用out.println(string);还是用<%=string%>,都必须作UNICODE到GBK 的转换,或者手动,或者自动。

在JSP 1.0中,可以定义输出字符集,从而实现内码的自动转换。

用法是<%@page contentType=”text/html;charset=gb2312” %>但是在一些JSP 版本中并没有提供对输出字符集的支持,(例如JSP 0.92),这就需要手动编码输出了,方法非常多。

最常用的方法是String s1 = request.getP arameter(“keyword”);String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);getBytes 方法用于将中文字符以“ISO-8859-1”编码方式转化成字节数组,而“GBK” 是目标编码方式。

我们从以ISO-8859-1方式编码的数据库中读出中文字符串 s1 ,经过上述转换过程,在支持GBK 字符集的操作系统和应用软件中就能够正确显示中文字符串s2 。

回页首Java 中文问题的表层分析及处理.CLASS 文件存放在服务器端,由客户端的浏览器运行 AP P LET ,A PP LE T 只起调入FRAME类等主程序的作用。

界面包括Textfield ,TextArea,List,Choice 等。

I.用JDBC 执行SE LECT 语句从服务器端读取数据(中文)后,将数据用 AP PEND 方法加到TextArea(TA),不能正确显示。

但加到List 中时,大部分汉字却可正确显示。

将数据按“ISO-8859-1” 编码方式转化为字节数组,再按系统缺省编码方式(Default Character E ncoding)转化为STRING ,即可在TA 和List 中正确显示。

在转换字符串时不采用系统默认编码方式,而直接采用“ GBK” 或者“GB2312” ,在A 和B 两种情况下,从数据库取数据都没有问题。

II.处理方式与“取中文”相逆,先将SQL 语句按系统缺省编码方式转化为字节数组,再按“ISO-8859-1”编码方式转化为STRING ,最后送去执行,则中文信息可正确写入数据库。

问题:如果客户机上存在CLASSP ATH 指向JDK 的CLASSES.ZIP时(称为A 情况),上述程序代码可正确执行。

但是如果客户机只有浏览器,而没有JDK 和CLASSP ATH 时(称为B 情况),则汉字无法正确转换。

我们的分析:1.经过测试,在 A 情况下,程序运行时系统的缺省编码方式为GBK 或者GB2312 。

在B 情况下,程序启动时浏览然后系统的缺省编码方式为“8859-1”。

2.如果在转换字符串时不采用系统缺省编码方式,而是直接采用“GBK” 或“GB2312”,则在A 情况下程序仍然可正常3.在客户机上,把JDK 的CLASSE S.ZIP解压后,放在另一个目录中,CLASSP ATH 只包含该目录。

然后一边逐步删除该目录中的 .CLASS 文件,另一边运行测试程序,最后发现在一千多个CLASS 文件中,只有一个是必不可少的,将该文件拷到服务器端和其它的类放在一起,并在程序的开头IMPORT 它,在B 情况下程序仍然无法正常运行。

4.在A 情况下,如果在CLASSP TH 中去掉sun.io.CharToByteDoubleByte.class ,则程序运行时测得默认编码方式为“8859-1”,否则为“GBK” 或“GB2312” 。

如果JDK 的版本为1.2以上的话,在B 情况下遇到的问题得到了很好的解决,测试的步骤同上,有兴趣的读者可以尝试一下。

回页首Java 中文问题的根源分析及解决在简体中文MS Window s 98 + JDK 1.3 下,可以用System.getP roperties() 得到Java 运行环境的一些基本属性,类P oorChinese 可以帮助我们得到这些属性。

类P oorChinese 的源代码:执行java P oorChinese 后,我们会得到:系统变量 file.encoding 的值为GBK ,nguage 的值为 zh ,user.region 的值为CN ,这些系统变量的值决定了系统默认的编码方式是GBK 。

在上述系统中,下面的代码将GB2312 文件转换成Big5 文件,它们能够帮助我们理解Java 中汉字编码的转化:?import java.io.*;import java.util.*;?public class gb2big5 {?static int iCharNum=0;?public static void main(String[] args) {System.out.println("Input GB2312 file, output Big5 file.");if (args.length!=2) {System.err.println("Usage: jview gb2big5 gbfile big5file");System.exit(1);String inputString = readInput(args[0]);writeOutput(inputString,args[1]);System.out.println("Number of Characters in file: "+iCharNum+"."); }?static void writeOutput(String str, String strOutFile) {try {FileOutputStream fos = new FileOutputStream(strOutFile);Writer out = new OutputStreamWriter(fos, "Big5");out.write(str);out.close();}catch (IOException e) {e.printStackTrace();e.printStackTrace();}}?static String readInput(String strInFile) {StringBuffer buffer = new StringBuffer();try {FileInputStream fis = new FileInputStream(strInFile); InputStreamReader isr = new InputStreamReader(fis, "GB2312"); Reader in = new BufferedReader(isr);int ch;while ((ch = in.read()) > -1) {iCharNum += 1;buffer.append((char)ch);}in.close();return buffer.toString();}catch (IOException e) {e.printStackTrace();return null;}}}?编码转化的过程如下:GB2312------------------>Unicode------------->Big5执行java gb2big5 gb.txt big5.txt ,如果gb.txt 的内容是“今天星期三”,则得到的文件big5.txt 中的字符能够正确显示;而如果gb.txt 的内容是“情人节快乐”,则得到的文件big5.txt 中对应于“节”和“乐”的字符都是符号“?”(0x3F),可见sun.io.ByteToCharGB2312 和sun.io.CharToByteBig5 这两个基本类并没有编好。

相关文档
最新文档