Java应用中的汉字乱码问题分析_刘长生
- 格式:pdf
- 大小:300.13 KB
- 文档页数:4
Java 应用中汉字显示成方块(方格)乱码的几种解决方法Java 应用中汉字显示成方块(方格)乱码的几种解决方法1.在 jre/lib/fonts/ 下建立个目录 fallbackmkdir /usr/lib/jvm/java-1.5.0-sun/jre/lib/fonts/fallback/2.在 fallback 里弄个中文字体拷贝或链接都可以ln -s /usr/share/fonts/truetype/arphic/uming.ttf/usr/lib/jvm/java-1.5.0-sun/jre/lib/fonts/fallback/3.进入 jre/lib/fonts/fallback/ 执行 mkfontscale再把 jre/lib/fonts/fallback/fonts.scale 的内容加到jre/lib/fonts/fonts.dircd /usr/lib/j2sdk1.5-sun/jre/lib/fonts/fallback/mkfontscalecd ..cat fallback/fonts.scale >> fonts.dir-----------------------------------------------------------Jinitiator控件IE崩溃及Jinitiator界面汉字方框的解决办法前几天拿到的一套网络销售系统原来还有个类似ERP的管理后台,折腾了半天才架设起来并找到入口,类似http://IP:7778/forms/frmservlet?config=webutil&form=main,初步了解了下,好像是用Oracle Form builder开发的。
在原来就安装好Jinitiator控件的一台服务器上(Windwos Server 2003操作系统)用IE打开这个网址,然后会弹出个类似JVM的界面,但界面上的汉字都是乱码的,就是显示成黑色线的方框。
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中的乱码问题汇总及解决⽅案java中的乱码问题最近做项⽬经常会遇到Java中的乱码问题,于是就抽时间整理下出现乱码问题的情况和如何处理,这⾥做了⼀个整理,分析编码与解码 编码就是将字符转为字节,解码就是就是将字节转换为字符。
字节流与字符流 对⽂件的读写操作都是通过字节流来实现的,即使JAVA中有字符流,但是其底层仍然使⽤的字节流。
乱码问题出现 java中使⽤最频繁的是字符,当我们将⽂件读⼊内存并在控制台显⽰时(字节流--->字符流),就需要⽤到解码。
如果⽂件是UTF-8编码,⽽我们解码时错⽤成GBK(如果不指定编码,JAVA会采取系统默认编码)来解码,那么只能显⽰乱码。
⽽我们写⽂件时,最好指定编码(UTF-8)。
解决⽅案⽰例1 将字节流转换为字符流时,我们指定编码格式。
这是我们⽂件也应该是gb2312编码public static String read(String filename) throws Exception {InputStream is = new FileInputStream(filename);BufferedReader in = new BufferedReader(new InputStreamReader(is,"gb2312")); //指定编码格式String s;StringBuilder sb = new StringBuilder();while ((s = in.readLine()) != null) {sb.append(s + "\n");}in.close();return sb.toString();}⽰例2 直接通过字节流读⼊,使⽤String转换为字符时,指定编码。
package com.dy.xidian;import java.io.FileInputStream;import java.io.InputStream;class BufferedInputFile {public static String read(String filename) throws Exception {@SuppressWarnings("resource")InputStream is = new FileInputStream(filename);byte[] b = new byte[1024];is.read(b);return new String(b, "gb2312");}}public class MemoryInput {public static void main(String[] args) throws Exception {String filename = "E:/html/gb2312.php";String s = BufferedInputFile.read(filename);System.out.println(s);}}陷阱 I/O操作中有个FileReader类,这个类隐藏了字节流转为字符流的细节,我们可以这样使⽤。
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中⽂乱码常见解决⽅式说明项⽬出现中⽂乱码现象、常见编码解决⽅法如下。
项⽬乱码项⽬⼯作空间在 Windows -> Prefenrences -> General -> Workspace 中进⾏设置在创建项⽬⼯作空间的时候、优先设置编码,在该⼯作空间下创建的项⽬默认遵循⼯作框架配置项⽬编码在 Project -> Resource中设置创建项⽬的时候、设置编码,则项⽬下⽂件都将会和项⽬统⼀页⾯⽂件编码⽂件右键 Properties -> Resource⽂件头编码⽂件头⼀般是HTML、JSP标签头部添加编码JSP:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>HTML:添加在<head>标签⾥⾯<meta http-equiv="Content-Type" content="text/html; charset=utf-8">编辑器编码设置NotePad++编辑器打开⼀个⽂件时候乱码在 菜单 -> 格式记事本存储时,保存为UTF-8格式服务器乱码SpringMVC在web.xml添加<filter><description>字符集过滤器</description><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><description>字符集编码</description><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>Tomcat编码Tomcat 的 conf/server.conf设置编码、设置为:<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"URIEncoding="UTF-8"redirectPort="8443" />添加:URIEncoding="UTF-8" 属性请求响应编码设置请求、响应编码//设置获取请求的编码request.setCharacterEncoding("utf-8")//设置服务器端的编码response.setCharacterEncoding("utf-8");//通知浏览器服务器发送的数据格式response.setContentType("text/html;charset=utf-8");字符串编码String oldStr = "编码设置";String newStr = new String(oldStr.getBytes(), "UTF-8");System.out.println("UTF-8编码:" + newStr);JDBC 连接指定编码url=jdbc:mysql://127.0.0.1/database?characterEncoding=UTF-8数据库设置编码编码可选:mysql> set character_set_client=utf8;mysql> set character_set_connection=utf8;mysql> set character_set_database=utf8;mysql> set character_set_results=utf8;mysql> set character_set_server=utf8;mysql> set character_set_system=utf8;mysql> set collation_connection=utf8;mysql> set collation_database=utf8;mysql> set collation_server=utf8;数据库表设置编码创建表的时候、指定编码:DEFAULT CHARSET=UTF8;CREATE TABLE `type` (`id` int(10) unsigned NOT NULL auto_increment,`type_name` varchar(50) character set utf8 NOT NULL default '', PRIMARY KEY (`id`)) DEFAULT CHARSET=UTF8;补充如果出现乱码现象、可对应⽂章修改。
JAVA中⽂字符乱码解决详解⾸先要了解JAVA处理字符的原理。
JAVA使⽤UNICODE来存储字符数据,处理字符时通常有三个步骤:– 按指定的字符编码形式,从源输⼊流中读取字符数据– 以UNICODE编码形式将字符数据存储在内存中– 按指定的字符编码形式,将字符数据编码并写⼊⽬的输出流中。
所以JAVA处理字符时总是经过了两次编码转换,⼀次是从指定编码转换为UNICODE编码,⼀次是从UNICODE编码转换为指定编码。
如果在读⼊时⽤错误的形式解码字符,则内存存储的是错误的UNICODE字符。
⽽从最初⽂件中读出的字符数据,到最终在屏幕终端显⽰这些字符,期间经过了应⽤程序的多次转换。
如果中间某次字符处理,⽤错误的编码⽅式解码了从输⼊流读取的字符数据,或⽤错误的编码⽅式将字符写⼊输出流,则下⼀个字符数据的接收者就会编解码出错,从⽽导致最终显⽰乱码。
这⼀点,是我们分析字符编码问题以及解决问题的指导思想。
好,现在我们开始⼀只只的解决这些乱码怪兽。
⼀、在JAVA⽂件中硬编码中⽂字符,在eclipse中运⾏,控制台输出了乱码。
例如,我们在JAVA⽂件中写⼊以下代码:String text = “⼤家好”;System.out.println(text);如果我们是在eclipse⾥编译运⾏,可能看到的结果是类似这样的乱码:。
那么,这是为什么呢?我们先来看看整个字符的转换过程。
1. 在eclipse窗⼝中输⼊中⽂字符,并保存成UTF-8的JAVA⽂件。
这⾥发⽣了多次字符编码转换。
不过因为我们相信eclipse的正确性,所以我们不⽤分析其中的过程,只需要相信保存下的JAVA⽂件确实是UTF-8格式。
2. 在eclipse中编译运⾏此JAVA⽂件。
这⾥有必要详细分析⼀下编译和运⾏时的字符编码转换。
– 编译:我们⽤javac编译JAVA⽂件时,javac不会智能到猜出你所要编译的⽂件是什么编码类型的,所以它需要指定读取⽂件所⽤的编码类型。
Java中文乱码的解决方案jsp+Servlet的形式,在jsp页面向后台发送的请求里包含中文时,后台采用String name = request.getParameter("name")接收到的是乱码,我在网上找了很多资料,有网友说request.getParameter是默认采用ISO8859-1来编码的,必须进行转换:我总结了一下,解决中文乱码大概有以下几种方式:1、采用decode()方法.URLDecoder.decode(s)2、采用设置字符集的方式request.setCharacterEncoding("utf-8");3、在页面上定义charset的字符集<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><meta http-equiv="Content-Type" content="text/html; charset=utf-8">4、在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8<filter><filter-name>encodingFilter</filter-name><filter-class>com.demo.filter.CoreFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>5、在form表单里定义编码accept-charset="utf-8" onsubmit="document.charset='utf-8';"6、更改ContentTypes的值改变myeclipse里ContentTypes的值为utf-87、改变tomcat字符集通过改变server.xml文件里的字符集来接收中文8、采用转码的方式nameCode = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");补充:如果是Servlet向页面发送的数据中包含中文,可以采用如下方式解决:response.setContentType("text/html;charset=utf-8");。
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项目中读取外部的文本文件,文件的编码可能与项目编码不一致,导致读取中文内容乱码。
1. 开发环境乱码 -- eclipse或ant编译乱码将java系统默认的字符集cp1253 改成GBK 修改控制面板--区域与语言否则在用ant运行java程序的时候会出现编码的错误原因是java 在运行时会调用系统的默认配置文件System.getProperties();其中有个file.encoding 的属性决定编码集,如果是英文版的操作系统则file.encoding=CP1253所以ant 运行中文程序会乱码如果不想修改系统默认字符集的话,可以再ant java target中加入下面语句<javac srcdir="${project.src}"destdir="${project.output.build}"debug="on" encoding="UTF-8"deprecation="on"listfiles="on"includeAntRuntime="no"><compilerarg value="-Xlint:all"/><classpath refid="project.classpath"/><classpath refid="tomcat.classpath"/></javac><java classpathref="project.classpath" classname="com.mose.ParserEnglish" fork="true" failonerror="true"> <sysproperty key="file.encoding" value="UTF-8"/><arg value="-h"/></java>2. web开发乱码2.1 解决响应中的乱码何为响应中的乱码?把页面中的“username”改成“用户名”你就知道了。
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编码,确保文件名中的中文字符能够正确传输和显示。
遇到中文乱码问题时,需要在不同的环节进行编码转换和设置,确保中文字符能够正确传输和显示。
通过统一字符编码、设置响应头的字符编码、对请求参数进行编码转换等对策,可以有效解决中文乱码问题,提高项目的可用性和用户体验。
收稿日期:2005-04-11作者简介:刘长生(1979—),男,江苏丰县人,硕士研究生,研究方向为企业信息化和J2EE 应用;丁秋林,教授,博士生导师,研究方向为企业信息化与系统集成。
Java 应用中的汉字乱码问题分析刘长生,谢 强,丁秋林(南京航空航天大学计算机应用研究所,江苏南京210016)摘 要:根据Java 应用中乱码出现的原因将问题分成了4类:由于编译不当导致的乱码、Web 应用中的乱码、数据库读写中的乱码和I /O 读写中的乱码。
在各个类别中,先给出出现乱码时的现象,然后对现象进行原因分析,再给出解决的办法。
最后,根据做项目的实践经验,给出了一些解决汉字乱码问题的心得。
关键词:Java ;字符集;中文乱码中图分类号:T P319 文献标识码:A 文章编号:1005-3751(2006)01-0158-04Analysis of Chinese Character Encoding in Java ProgrammingLIU Chang -sheng ,XIE Qiang ,DING Qiu -lin(Computer Application Institute ,Nanjing U niversity of Aeronautics and Astronautics ,Nanjing 210016,China )Abstract :First classify the problems into four catalogs according to different causes :incorrect compiling ,communication Web application ,R /W in database and R /W in I /O .After that ,analyze the cause of phenomenon ,and then give a solution in each catalog .Finall y ,come up w ith some conclus ions which w ere summarized from practical p roject .Key words :J ava ;character set ;Chinese character encoding0 前 言现在大部分具有国际化特征的软件核心字符处理都是以Unic ode 为基础的,在软件运行时根据当时的Loc ale /Lang /Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符[1]。
在处理过程中需要实现Unicode 和本地字符集的相互转换,甚或以Unicode 为中间的两个不同本地字符集的相互转换。
这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可接受的内容[2]。
Java 语言在内部采用Unicode 表示字符,遵守Unic ode V2.0。
Java 程序无论是从/往文件系统以字符流读/写文件,还是往URL 连接写HTM L 信息,或从U RL 连接读取参数值,都会有字符编码的转换。
这样做虽然增加了编程的复杂度,容易引起混淆,但却符合国际化的思想。
中文编码有GB2312,GBK ,BIG5,GB18030-2000等,Jdk1.5已经支持GB18030-2000,如果不熟悉Java 中的中文处理方式及相应规范,就很容易造成乱码问题。
在很多种情况下都可能导致Ja va 的中文乱码问题,可以把这些情况大致分成如下几类:由于编译不当导致的乱码、Web 应用中的乱码、数据库读写中的乱码和I /O 读写中的乱码。
下面文中对这几种情况做逐一探讨。
1 由于编译不当导致的乱码1.1 现 象下例是一个类的代码片断:public void encodingT est (){ String str =“你”; System .out .println (str );}上例在中文平台上缺省编译(-Enc oding GB2312),生成ZhClass ,在英文平台上缺省编译(-Enc oding ISO8859-1),生成EnClass 。
ZhClass 在中文平台上执行可以正确显示汉字“你”,但是在英文平台上会出现乱码“?”。
EnClass 在英文平台上执行可以正确显示汉字“你”,但是在中文平台上会出现乱码“??”。
1.2 原因分析编译Java 源程序要调用Javac ,如果没有指定Enc oding ,则按照系统的默认Encoding 。
中文平台上是GB2312,英文平台上是ISO8859-1。
Java 的编译器实际上是调用sun .tools .Javac .M a in 这个类对源文件进行编译,这个类的compile 函数中间有一个enc oding 的变量,-enc oding 的参数其实直接传给encoding 变量。
编译器就是根据这个变量来读取Java 文件的,然后用UTF -8形式编译成class 文件[3]。
如果用GB2312编译,在生成的class 文件中会有E4BD A0的字段,如果用ISO8859-1编译,则会在生成的class 文件中找到C184C3A3的字段。
这是因为UTF -8和Unicode 有如下对应关系:第16卷 第1期2006年1月 计算机技术与发展COM PUTER T ECHNOLOGY AND DEVE LOPM ENT Vol .16 No .1Jan .2006(1)对于7位的Unicode (单字节,高位为0),在其首位加0即可,即:0_______(2)对于11位的Unicode (两个字节,高位字节高五位为0),在其首位前加110,在第六位和第七位之间添加10,即:110_____10______(3)对于16位的Unicode (两个字节,高位字节高五位中有的不为0),在其首位前加1110,在第六位和第七位之间添加10,在十二和十三位之间添加10,即:1110____10______10______如果用GB2312进行编译,编译器首先以GB2312对读进来的字节进行解码,字符串“你”的GB2312码为0xC4E3,然后转变成相应的Unicode ,字符串“你”的Unicode 为0x4F60。
0x4F60的二进制是01001111--01100000,根据规则用UTF -8补齐,变成:11100100--10111101--10100000(E4--BD --A0),所以在生成的c lass 文件中会有E4,BD ,A0字段。
其过程如图1所示。
图1 在中文平台编译流程同样的道理,如果用ISO8859-1进行编译,编译器首先以ISO8859-1对读进来的字节进行解码,其中字符串“你”的原始编码为0xC4E3,然后转变成相应的Unicode ,其中字符串“你”的Unicode 为0x00C4,0x00E3(ISO8859系列字符集是单字节字符集,所以映射到Unicode 要高字节补0)。
0x00C4的二进制是00000000--11000100,因为每个字符都大于7位,因此用11位编码,根据规则用U TF -8补齐,变成11000011--10000100(C3--84)。
同理类推,0x00E3会变成11000011--10100011(C3--A3),所以在生成的class 文件中会存在C3,84,C3,A3字段,其过程如图2所示。
图2 在英文平台编译流程在中文平台上缺省编译后,其实str 在运行态的c har []是0x4F60,ZhClass 在中文平台上运行,系统的缺省编码是GB2312,因此CharToByteConverter (在sun .io 的包中)会自动用调用GB2312的c onverter ,把str 转化成0xC4E3,所以系统打印出“你”。
但是如果ZhClass 是在英文平台下运行,CharToByteConverter 的缺省值是ISO8859-1,系统会自动调用ISO8859-1去转化st r ,但是它无法解释,这时系统把它转变成0x3F (?的ISO8859-1的编码),因此系统会输出“?”,出现了乱码。
在英文平台上缺省编译后,其实str 在运行态的char []是0x00C40x00E3,EnCla ss 在中文平台上运行,中文系统无法识别0x00C40x00E3,因此会出现乱码“??”,但是,当EnClass 在英文平台上运行,0x00C4被转化成0xC4,0x00E3被转化成0xE3,所以可以正确显示汉字“你”(其实每次显示“半”个汉字)。
1.3 解决办法通过以上分析可以总结出对于此类问题的解决办法是:对于放在操作系统中的.Java 源程序,在编译时,要指定它内容的编码格式,具体来说用-encoding 来指定。
如果源程序中含有中文字符,而用-encoding 指定为其它的编码字符,显然是要出错的。
用-encoding 指定源文件的编码方式为GBK 或GB2312,无论在什么系统上编译含有中文字符的Java 源程序都不会有问题,它都会正确地将中文转化为U TF -8存储在类文件中[3]。
2 Web 应用中的乱码问题2.1 现 象从一个JSP 页面输入的中文被处理后返回的结果却是一些问号或乱码。
2.2 原因分析图3说明了从JSP 源文件到客户端的流程。
图3 Web 服务器处理示意图在这一过程中有字符编码转换的地方包括:1)JSP 编译:Java 应用服务器将根据JVM 的file .enc oding 值读取JSP 源文件,编译生成Java 源文件,再根据file .encoding 值写回文件系统。
2)Java 源文件被编译为cla ss 文件:这个过程与一般的源程序编译成cla ss 文件相同。
从这里开始Servlet 和JSP 的运行就类似了,只不过Servlet 的编译不是自动进行的。
对于JSP 程序,对产生的Java 中间文件的编译是自动进行的(在程序中直接调用sun .tools .Java c .Main 类)。
3)客户端读取服务器段的输出和服务器端读客户端·159·第1期 刘长生等:Jav a 应用中的汉字乱码问题分析的输入:Servlet需要将HTM L页面内容转换为brow ser可接受的enc oding(用c ontent-type指定)内容发送出去。
在目前的Servlet的规范中,如果不指定的话,通过Web提交时输入的Servlet R equest和输出时的ServletResponse缺省都是以ISO8859-1进行编码/解码的(这里的编码/解码方式是和操作系统环境中的语言环境是无关的)。