不同情况下的乱码处理方案

上传人:ren****ao 文档编号:160596316 上传时间:2022-10-10 格式:DOC 页数:35 大小:642.01KB
收藏 版权申诉 举报 下载
不同情况下的乱码处理方案_第1页
第1页 / 共35页
不同情况下的乱码处理方案_第2页
第2页 / 共35页
不同情况下的乱码处理方案_第3页
第3页 / 共35页
资源描述:

《不同情况下的乱码处理方案》由会员分享,可在线阅读,更多相关《不同情况下的乱码处理方案(35页珍藏版)》请在装配图网上搜索。

1、PRIMETON TECHNOLOGIES, LTD.上海普元信息技术有限责任公司不同情况下的乱码处理方案经验技巧总结No part of this document may be reproduced, stored in any electronic retrieval system, or transmitted in any form or by any means, mechanical, photocopying, recording, otherwise, without the written permission of the copyright owner.COPYRIGH

2、T 2006 by Primeton Technologies, Ltd. ALL RIGHTS RESERVED.文档修订记录序号版本号修订日期修订概述修订人审批人备注10.12006-11-20创建林地发规范及约定1. 【规范及约定】的内容仅仅是对本文档编写的规范和约定进行描述,文档编写人员必须严格按照本规范和约定进行编写,在文档正式发布时删除该部分内容;2. 文档内容采用“首行缩进、小四号字体、1.5倍行距”的格式,选中段落文本使用快捷键【Ctrl+Alt+4】可以进行格式化(直接选中蓝色的说明文字即可);3. 必须填写“文档修订控制记录”;4. 文档目录必须更新为最新的,与实际内容相对

3、应;5. 模版中每部分内容的下面的蓝色字体是对这块内容的说明,编写文档时选中这段文字,使用【Ctrl+Alt+4】快捷键即可格式化成要求的字体; 1 文档摘要1.1 文档分类经验技巧-常见问题级、常见问题-运行、FAQ-EOS Server1.2 关键字/Tag乱码、EOS、WebSphere、配置文件、分界点、转码、字符集1.3 摘要本文档是针对我们遇到乱码问题的经验总结,同时,列出了EOS+WebSphere5.1环境下经常遇到过得乱码问题的解决过程1.4 作者、协作者及评审人员作者、写作者:林地发、华石新评审人员:初评小组、刘国鹏1.5 定义、首字母缩写词及缩略语隐含提交: jsp文件中

4、通过引用/fbtools/page/hiddensubmit.js,将客户端的请求通过ajax提交到fbtoolspagehiddensubmit.jsp来获取服务器端数据2 简介2.1 场景描述在浏览器界面上出现乱码、出现“?”、出现解析XML错误、js脚本错误2.2 适用环境EOS5.X+WebSphere5.x3 经验总结3.1 解决思路乱码是应用系统运行中经常出现的一个问题,也是应用系统中非常突出而且必须解决的一个问题。由于引起出现乱码的因素很多,所以解决乱码问题比较复杂。本文从编码原理到实际案例对乱码原因进行详细的分析,并且整理和归纳了多个项目出现乱码现象的解决经验,总结了解决一般性

5、乱码的办法和过程。在整个B/S请求从客户端页面提交内容到服务器,服务器接收响应,并从数据库中获取数据,经过一番处理之后再返回给客户端的浏览器页面显示的过程中,只要一个环节在转码过程中有错误就会导致乱码的现象发生。如果你的系统出现了乱码,首先不要着急,不要被系统中出现的问题所吓坏。如果出现了这种问题又该如何办呢?我们应该先判断乱码的现象,要根据现象,查出数据在整个数据流向的过程中,数据到底从什么时候什么地方开始由正常开始变为乱码,即找出数据变成乱码的分界点: 如果是数据库中的数据本身是乱码,需要检查数据库的字符集是否设置正确,不同的数据库不一样比如Oracle数据库在安装的过程中就可以选择某种字

6、符集:ALTER DATABASE CHARACTER SET ZHS16GBK查找当前字符集:select userenv(language) from dual;DB2在创建数据库的时候可以指定字符集:create database sccrm using codeset UTF-8 territory CNMySQL在创建数据库的时候可以指定字符集:create database testxxx default charset=UTF-8 操作系统是否安装相应的字符集(unix下可以用locale查看当前字符集),将相应的数据打印出来即可 Java程序是否存在转码错误,字符集经常是在UT

7、F-8、GBK、ISO-8859-1之间转换 应用服务器各个相关设置字符集的地方是否设置正确找到分界点之后,针对分界点之前和之后,查找在什么地方可以设置字符集,每一个分界点可以在哪些地方设置相关的字符集。如果是程序,可以查找到哪一行代码获取数据的时候开始乱码,从而可以考虑修改代码。如果不是程序,需要查看当前应用有哪些地方可以设置字符集,并且要了解每个设置字符集的地方,他们之间的相互关系3.2 编码转换的关键点常见乱码现象: 浏览器中看到的 Jsp/Servlet 页面中的汉字变成成了 ? 浏览器中看到的 Servlet 页面中的汉字变成成了乱码 Jsp/Servlet 页面无法显示 GBK 汉

8、字 JSP 页面中内嵌在,等Tag包含的 JAVA code 中的中文成了乱码,但页面的其它汉字是对的 Jsp/Servlet 不能接收 form 提交的汉字 JSP/Servlet 数据库读写无法获得正确的内容隐藏在这些问题后面的是各种错误的字符转换和处理,是因为 Java font 设置错误引起的。解决类似的字符 encoding 问题,需要了解 Jsp/Servlet 的运行过程,检查可能出现问题的各个点。 根据如上图表,我们可以得出编码转换点如下: JSP 编译:Java 应用服务器将根据 JVM 的 file.encoding 值读取 JSP 源文件,编译生成 JAVA 源文件,再根

9、据 file.encoding 值写回文件系统。如果当前系统语言支持 GBK,那么这时候不会出现 encoding 问题。如果是英文的系统,如 LANG 是 en_US 的 Linux, AIX 或 Solaris,则要将 JVM 的 file.encoding 值置成 GBK 。系统语言如果是 GB2312,则根据需要,确定要不要设置 file.encoding,将 file.encoding 设为 GBK 可以解决潜在的 GBK 字符乱码问题 Servlet 需要将 HTML 页面内容转换为 browser 可接受的 encoding 内容发送出去。依赖于各 JAVA App Server

10、 的实现方式,有的将查询 Browser 的 accept-charset 和 accept-language 参数或以其它可能的方式确定 encoding 值,有的则不管。因此采用固定encoding 也许是最好的解决方法。对于中文网页,可在 JSP 或 Servlet 中设置 contentType=text/html; charset=GB2312;如果页面中有GBK字符,则设置为contentType=text/html; charset=GBK,由于IE 和 Netscape对GBK的支持程度不一样,作这种设置时需要测试一下。因为16位 JAVA char在网络传送时高8位会被丢弃,

11、也为了确保Servlet页面中的汉字(包括内嵌的和servlet运行过程中得到的)是期望的内码,可以用 PrintWriter out=res.getWriter() 取代 ServletOutputStream out=res.getOutputStream(). PrinterWriter 将根据contentType中指定的charset作转换 (ContentType需在此之前指定!); 也可以用OutputStreamWriter封装 ServletOutputStream 类并用write(String)输出汉字字符串。对于 JSP,JAVA Application Server

12、应当能够确保在这个阶段将嵌入的汉字正确传送出去。 解释 URL 字符 encoding也有可能出现乱码。如果通过 get/post 方式从 browser 返回的参数值中包含汉字信息, servlet 将无法得到正确的值。URL传值为浏览器客户端按iso-8859-1进行传输,服务器可以设置URL传输中文时可以不再指定编码而直接可以得到客户端传输的中文字符。 JSP/Servlet 编程中经常出现 encoding 问题的另一个地方是读写数据库中的数据。流行的关系数据库系统都支持数据库 encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。当应用

13、程序访问数据时,在入口和出口处都会有 encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性. GB2312,GBK,UTF-8 等都是可选的数据库 encoding;也可以选择 ISO8859-1 (8-bit),那么应用程序在写数据之前须将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符,读数据之后则需将两个字节合并起来。没有充分利用数据库 encoding 的作用,反而增加了编程的复杂度,ISO8859-1不是推荐的数据库 encoding。JSP/Servlet编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。然后

14、应当注意的是读出来的数据的 encoding,JAVA 程序中一般得到的是 Unicode。写数据时则相反。3.3 定位问题时常用的技巧定位中文encoding问题通常采用最笨的也是最有效的办法在你认为有嫌疑的程序处理后打印字符串的内码。通过打印字符串的内码,你可以发现什么时候中文字符被转换成Unicode,什么时候Unicode被转回中文内码,什么时候一个中文字成了两个 Unicode 字符,什么时候中文字符串被转成了一串问号,什么时候中文字符串的高位被截掉了取用合适的样本字符串也有助于区分问题的类型。如:”aa啊aa?aa” 等中英相间、GB、GBK特征字符均有的字符串。一般来说,英文字符

15、无论怎么转换或处理,都不会失真(如果遇到了,可以尝试着增加连续的英文字母长度)3.4 WEBSPHERE字符集相关配置有两种字符集编码问题值得注意:一、Request/Response 字符集- HTTP接收、发送的参数的字符集,例如从表单中和从JSP网页中提交的内容二、JSP网页编码- JSP文件本身的编码因为很多人都混淆这两种编码问题,而且被什么参数影响什么编码所迷惑。下表是总结参数影响编码转换的各种情况Request/Response字符编码JSP文件编码WebSphereV5.X(JSP1.2Servlet2.3)Extension enabled扩展方式1.隐式设置ll Encodi

16、ng.properties(default)3.文件编码l pageEncodingl contentType l file.encoding(default)Extension disabled(default)默认非扩展方式2.显式设置Servletl setChareacterEncoding()(request)l setContentType()(response)JSPl setCharacterEndcoding()(request)l contentType (response)3.4.1 设置Request/Response 编码通常,从表单中发送的request参数是以fo

17、rm本身的同样的编码进行编码的。也就是说request和response编码是相同的。这些编码能够决定隐式和显式的设置方式。Websphere实现隐式设置方式去帮忙开发全球的应用。有了隐式设置方式,英文版的应用运行在中文版本下就无须任何代码上改动。而且Websphere也提供显式设置方式去保持与其它应用的兼容。哪一种方式更适合应用本身由设计者自己决定。隐式设置方式Websphere的全球化扩展。Websphere有内置的能力去减化全球化版本的开发。它隐式的提供了根据accept-language HTTP协议头进行字符集转换的功能。这是websphere能够帮助你开发全球版本的重要原因之一。W

18、AS_HOME/properties/Encoding.propertiesWebshpere决定了request/response的编码,在分析客户输入的值时用getparameter和writing输出的时候跟据accpt-language值。这个语言值(accept-language)和编码名称与encoding.properties关联。如下图Encoding.properties文件示例如下:其它应用服务器可能只支持iso-8859-1编码。并且如果你想支持其它语言,你可能不得不在每个servlet中包含一个特殊处理的代码设置扩展方式注意,在webshpere中默认为非扩展方式。如果

19、要设置为扩展方式,你不得不把autoRequestEncoding 和autoResponseEncoding设置为真,在ibm-web-ext.xmi文件中如下图: C也有可能在某些情况下,你想覆盖encoding.properties中的设置,当你想用UTF-8在整个系统当中,在JVM中设置注意,编辑encding.properties将影响在Websphere系统中的所有的应用显式设置方式 标准方式(非扩展方式)当你想用Websphere的扩展功能时,你可方便的采用隐式设置。如果你想兼容其它系统,你可“显式”的覆盖环境设置去支持你想要的编码。在这样的情况下,你不得不在代码层面指明编码,并

20、且进行显式的转换Servlet你可以告诉你的容器你想在servletAPI中应用什么编码,setCharacterEncoding( ) and setContentType( ),通过这些API你可以显式的设置编码。setCharacterEncoding()能用在WASV5版本之上。在做这样之前你必须调用getParameter()之前调用setCharacterEncoding(), setContentType()必须在调getWriter()之前。下面为代码示例:Sending input to ServerInput your name and push sendform.html

21、提交内容到FormServletJava Server Pages (JSP) 在JSP里,contentType能够用于指定输出的HTML编码。下面的代码可以实现。JSP创建了输出的HTML在charset中指明了contentType页面。你应该总是设置编码,因为这样可以为每个JSP指明自己的编码。3.4.2 JSP页面编码JSP是动态的编译成为Java字节码的,Java字节码的存储方式为Unicode(UTF-8),而且从JSP的页面编码到Unicode是必要的。Java编译器通过contentType页面指写编码,所以在编码JSP代码中要指定contentType。这个参数同时还用于指

22、定输出的编码。而且这两个编码是一样的。这种设计减少编码问题。pageEncoding也有可能,JSP的编码和输出的编码是不同的。这种情况下,pageEncoding可以用于指明JSP文件的编码。defaultEncoding如果所有的JSP都以同样的编码,那么设置defaultEncoding在ibm-web-ext.xmi中是一个好的办法。那么JSP中就可无须设置contentType值。下如是决定页面编码的顺序: The JSP pages contentType directives charset. The defaultEncoding parameters value. The v

23、alue of the system property file.encoding (default) file.encoding是系统属性,它指明了当前java环境的字符编码,例如你的服务器运行在中文环境下,file.encoding=GBK。因为这个值取决于运行系统,你应该设置其它编码方式,不推荐使用file.encoding值做为页面的编码设置。3.5 WEBLOGIC字符集相关配置WebLogic Server 中 I18n 的主要特性: 在 WebLogic Server 内部,所有字符都按 Unicode 进行处理。只要输入或输出字符数据,就执行代码转换。 必须分别为 WebLog

24、ic Server、J2EE 组件和 WebLogic Server 容器上的资源指定适当的编码转换。 如果不指定编码转换,系统将应用默认的编码转换。 与 JSP/Servlet 有关的编码设置包括 从 Servlet 输出的 HTTP 响应中使用的写入器编码 JSP 文件的编码 从 JSP 输出的写入器编码 HTTP 请求(如 GET/POST)的编码(对于特定的请求 URL) 数据(如 GET/POST)的编码(对于特定的 HTTP 请求) JSP 容器的编码 Java 编码和 IANA 字符集之间的映射 如果指定了多个参数,可以通过一组特定的规则来确定哪个参数有效。例如,如果 UTF-8

25、 设置为 JSP 容器的默认编码,但在特定 JSP 的 page 标记中指定了 GB2312,则将使用 GB2312。一般来说,在较小范围中指定的编码具有较高的优先级。如有必要,可以在较大的范围中设置默认编码,并在较小的范围中设置特殊编码。建议您在整个应用程序中使用同一种编码。使用简体中文的一般步骤如上所述,WebLogic Server 提供一组用来指定编码的参数。在使用它时,必须指定从 HTTP 请求到 HTTP 响应的所有内容。在默认情况下,将使用 ISO-8859-1 编码。3.5.1 Servlet1. 指定 HTTP 响应的编码 - response.setContentType(

26、) 2. 指定浏览器显示的编码 - HTML Content-Type 3. 指定 HTTP 请求的编码 - request.setCharacterEncoding 或 指定 HTTP 响应的编码方法为 response.setContentType(),要为由 Servlet 生成的 HTML 页面指定编码,请使用 setContentType() 方法。对 setContentType() 的调用指定下列内容: 用于响应的 HTTP 头中的 ContentType 特性 用于输出响应的写入器编码 因此,在获得写入器之前,必须先调用 setContentType()。res.setCont

27、entType(text/html;charset=GB2312);PrintWriter out = res.getWriter();该调用指定 HTTP 头中的 contentType。这意味着同时指定了浏览器显示的编码。指定 HTTP 请求的编码 - request.setCharacterEncoding 或 现在,您已经指定了 HTTP 响应(使用上述方法从 WebLogic Server 发送到客户端的数据)的编码设置。下面描述了在将数据从客户端发送到 WebLogic Server 时,如何设置 HTTP 请求的编码。可通过三种方法指定 HTTP 请求的编码: 将字符集写入 HT

28、TP 请求的 contentType 中 此方法最符合 HTTP 规范。但是,不能在 Microsoft Internet Explorer 或 Netscape 浏览器中指定该值。 在服务器上指定 HTTP 请求的编码 使用 request.setCharacterEncoding() 方法。可以指定每个请求的编码。还可以执行更细化的操作(如动态控制编码)。另外,setCharacterEncoding() 符合 Servlet 2.3 规范。因此,可以实现应用程序可移植性。request.setCharacterEncoding(GB2312);String pval = request.

29、getParameter(pname); 使用 Web 应用程序部署描述符 (weblogic.xml) 中的 ,指定请求 URL 的编码。 在 WebLogic Server 6.0 中,它在 web.xml 中进行设置。在 WebLogic Server 6.1 或更高版本中,它在 weblogic.xml 中进行设置。同时,元素名称等也进行了更改。因此,如果从 WebLogic Server 6.0 迁移,需要修改 weblogic.xml 和 web.xml 文件。对于从客户端 Web 浏览器的请求 URL 中指定的资源, 的值确定该资源的路径在服务器端的编码。示例: Obtain h

30、ttp:/localhost:7001/webappa/path1/ in UTF-8 Obtain http:/localhost:7001/webappa/path2/ in GB2312 系统允许使用这些配置。可以按如下所示描述 。目标 Web 应用程序的 元素应当写在部署描述符 (weblogic.xml) 文件中。在 (内嵌于 )中,写入要为其指定编码的请求 URL 路径,以及要为 HTTP 请求指定的编码(用 IANA 名称)。有关 Java 编码名称和 IANA 字符集之间映射的信息,请参阅“Java 编码和 IANA 字符集之间的映射(在 weblogic.xml 中设置)”部

31、分。下面是一个处理多个编码的 Web 应用程序的示例。在本例中,“/*”的编码设置为 UTF-8,“/rus/jo/*”的编码设置为 GB2312。 /* UTF-8 /rus/joe/* GB2312 3.5.2 JSP1. 指定 JSP 文件的编码 - page 标记中的 pageEncoding 指令(可选) 2. 指定页面输出的编码 - page 标记中的 contentType 指令 3. 指定浏览器显示的编码 - HTML Content-Type 4. 指定 HTTP 请求的编码 - request.setCharacterEncoding 或 指定 JSP 文件的编码 - pa

32、geEncoding(可选)要指定 WebLogic Server JSP 容器或 JSP 编译器用来读取 JSP 文件的编码,请在 page 标记中指定 pageEncoding 指令,如下所示:指定页面输出的编码 - page 标记中的 contentType 指令要指定页面输出的编码,请在 page 标记中指定 contentType 指令,如下所示:另外,当您在 page 指令中指定 contentType 时,会在 HTTP 响应的 HTTP 头中指定同样的 contentType,这意味着同时指定了浏览器显示的编码。如果未设置 pageEncoding 指令,会将 contentT

33、ype 指令用作读取 JSP 文件的编码。如果 JSP 容器找到 contentType 设置,会停止解析 JSP 文件,将文件读取器切换到这个新指定的编码,重新从头解析 JSP 页。如果在一个文件中指定了多个 contentType,就会出现解析错误。因此,使用静态包含将一个文件包含在另一个文件中时,如果这两个文件都有各自的编码规范,就会出现错误。在动态包含中,不会出现错误,但是将生成乱码字符。注意:如果在一个文件中发现多个 contentType 实例,这两个实例都使用相同的值,则是有效的,不会导致解析错误。(有关详细信息,请参阅静态与动态包含以及编码差异)。 backwardCompat

34、ible true例如,当使用静态包含 (% include) 执行包含操作时,如果“包含源”和“包含目标”都有各自的 page 指令,并且一个转换单元有多个 page 指令,则只要每个 page 指令都指定相同的编码,就不会发生任何问题。指定 HTTP 请求的编码可以像在 Servlet 中一样,在 JSP 中指定 HTTP 请求的编码。有关详细信息,请参阅 Servlet 部分。3.6 字符集转换流程转换流程图客户端JSP文件JAVA文件数据库文件存储Class文件ServletGB2312UTF-8unicodeunicode服务器指定浏览器指定GB2312GB2312UTF-8UTF-

35、8一、JAVA文件编译成Class文件过程的编码问题 JDK中与中文相关的编码列表编码名称说明ASCII7位,与ascii7相同ISO8859-18-位,与 8859_1,ISO-8859-1,ISO_8859-1,latin1.等相同GB2312-8016位,与gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381, 1383, Cp1383, ISO2022CN,ISO2022CN_GB.等相同GBK与MS936相同,注意:区分大小写UTF8与UTF-8相同GB18030与cp1392、1392相同,目前支持的JDK很少Java源程序中的字符一般以UNICO

36、DE编码存储,在编译过程转换成相应的UTF-8编码。二、JSP文件动态编译成Servlet的的编码问题Jsp的源文件是以“.jsp”结尾的文本文件。在本节中,将阐述JSP文件的解释和编译过程,并跟踪其中的中文变化。1、JSP/Servlet引擎提供的JSP转换工具(jspc)搜索JSP文件中用% page contentType =text/html; charset=Jsp-charset%中指定的charset。如果在JSP文件中未指定Jsp-charset,则取JVM中的默认设置file.encoding,一般情况下,这个值是ISO8859-1;2、jspc用相当于“javac enco

37、ding Jsp-charset”的命令解释JSP文件中出现的所有字符,包括中文字符和ASCII字符,然后把这些字符转换成Unicode字符,再转化成UTF格式,存为JAVA文件。ASCII码字符转化为Unicode字符时只是简单地在前面加“00”,如“A”,转化为“u0041”(不需要理由,Unicode的码表就是这么编的)。然后,经过到UTF的转换,又变回“41”了!这也就是可以使用普通文本编辑器查看由JSP生成的JAVA文件的原因3、引擎用相当于“javac encoding UNICODE”的命令,把JAVA文件编译成CLASS文件三、JDBC与数据库数据交换时的编辑问题在JAVA运行

38、期时,内容交换的编码为unicode编码,JDBC接收到的字符流必须是合法的编码格式,然后由JDBC向数据库提交数据请求。JSP/Servlet 编程中经常出现编码问题,除了上述讨论的方面,另方面是读写数据库中的数据。目前业界常用的关系数据库系统都支持数据库多语言编码,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据就将以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有 encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。GB2312、GBK、UTF-8、ISO-8859-1等都是可选的数据库编码。但是如果编码设置成了ISO-8859-1

39、,则应用程序在写数据之前须将 16Bit 的一个汉字或 Unicode 拆分成两个 8-bit 的字符,读数据之后则需将两个字节合并起来,同时还要判别其中的 SBCS 字符。这种情况没有充分利用数据库编码的作用,反而增加了编程的复杂度。因此ISO-8859-1不是推荐的数据库编码。针对上述状况,下列代码示例了如果Java应用是基于GB18030编码,而数据库编码是ISO-8859-1的情况,如何通过Java代码转换字符而不会产生乱码: 1) 从数据库中读入含中文的字符串: PreparedStatement pst = ;ResultSet rst = ; String result = rs

40、t.getString(1);/从数据库得到某个字段的字符串结果result = new String(result.getBytes(GB18030);/对result的字符集重新进行编码,将其强制转为本地GB18030字符集 2) 将中文字符串写入数据库: PreparedStatement pst = ; sql = new String(sql.getBytes(),GB18030);/对sql的本地编码按GB18030进行解码,还原为数据库能接受的代码pst.execute(sql); 四、客户端与服务器之间的数据交换编码问题从browser到web server,可以在表单中指定提

41、交内容时使用的字符集,否则会使用页面指定的编码。而如果在url中直接用?的方式输入参数,则其编码往往是操作系统本身的编码,因为这时和页面无关。Web server接收到的是字节流,默认时(getParameter)会以iso8859-1编码处理之,结果是不正确的,所以需要进行处理。但如果预先设置了编码(通过request. setCharacterEncoding ()),则能够直接获取到正确的结果。4 解决过程(常见问题)下面描述的是我们遇到过得乱码的解决过程,下面遇到的乱码所出现问题前6个是在EOS5.X+WebSphere 5.X环境下发生的问题,第7个问题是在eos+webLogic下

42、出现的问题4.1 级联下拉列表乱码现象:级联下拉选择列表的内容在有的机器上能够出来,有的机器上出不来,比较了两台客户端机器所安装的浏览器以及操作系统版本以及各自配置完全一样解决过程:1. 先定位下拉列表的数据是否出来:经过javascript的跟踪,发现下来列表的数据已经出来了,但是,是乱码2. 定位乱码出现的地方(即在什么地方开始数据由正常变成乱码):从级联下拉列表的jsp可以知道引用的js文件pageComponentresourcesdynamicSelect.js,而dynamicSelect.js中通过ajax调用了web.xml上配置的一个名称叫bizService 的servle

43、t:,知道这个调用过程后。我们跟踪到服务器传给客户端就是乱码,基本确定乱码产生的原因在服务器。缩小范围。3. 跟踪ajax所调用的servlet的类是在什么地方开始出现乱码:反编译类,增加数据输出日志,发现servlet调用业务逻辑所获取的数据也正常,并没有出现乱码。到此,基本定位出字符集由正常变成乱码是在servlet往浏览器输出的时候出现乱码。4. 将类反编译之后,把该类的doPost方法中涉及到设置字符集的有三处: httpservletrequest.setCharacterEncoding(GBK); httpservletresponse.addHeader(Content-Typ

44、e, text/xml; charset= GBK ); httpservletresponse.setContentType(text/xml;charset= GBK );将上面三行代码中的“GBK”改成“UTF-8”并编译到服务器上,并重启服务器,问题解决注意:涉及到eos类的修改,不到迫不得已不要修改,如果要修改或者发现有bug也最好将bug提交bug跟踪系统,让研发的同事修改好后再更新。另外,这种乱码现象并不在其它环境上发生,如果发生我上面所描述的现象,你不妨试试。4.2 隐含提交乱码隐含提交:即jsp文件中通过引用/fbtools/page/hiddensubmit.js,将客户端

45、的请求通过ajax提交到fbtoolspagehiddensubmit.jsp现象:在隐含提交的页面中,输入中文,保存之后页面再读出是乱码解决过程:修改webSphere的配置文件WAS_HOME/config/cells/smtpserver/applications/eos4ws_wms.ear/deployments/default.war/WEB-INF/ibm-web-ext.xmi,将autoRequestEncoding改成false,重启服务器即可注意:如果集群环境下,必须修改主服务器即NT的那台机器,否则,该如果没有修改主服务器的配置文件,其它从服务器的该配置文件将会被主服务

46、器所覆盖4.3 EOS控制台乱码现象:刚安装完系统,登陆到控制台,首页出现带“?”的乱码现象解决过程:1、 备份WAS_HOME/lib/webcontainer.jar2、 将WAS_HOME/lib/webcontainer.jar下载到本地,将从林锋处获取的class:piler.ParserController替换一下3、 将webcontainer.jar后的jar上传到WAS_HOME/lib/目录下覆盖原来的jar文件注意:如果webSphere升级,将会覆盖webcontainer.jar文件,需要重新把class:piler.ParserController覆盖一下,另外,大

47、家更新的时候不要去更新其它class,因此要在安装好webSphere或者升级好的webSphere基础上获取WAS_HOME/lib/webcontainer.jar,而不要将别出或者其它版本的webcontainer.jar整个拷贝覆盖4.4 个别生僻字乱码(有的汉字乱码有的汉字不乱码)现象:界面中出现输入个别比较生僻的汉字出现乱码,也不是所有的汉字都出乱码,有的出,有的不出解决过程:1. cd WAS_HOME/properties目录2. 打开文件vi ./ encoding.properties3. 按esc,输入:$到该文件的最后行4. 查看打开的文件找到行zh=GB23125.

48、将zh=GB2312改成zh=GBK,因为常用汉字集合在GBK2312中,收录汉字6763个。要比生在GBK中共收汉字21004个要少6. 重启服务器,问题解决4.5 URL参数汉字乱码现象:在WebSphere的基础上,系统一切运行正常,IBM的工程师升级webSphere,升级之后出现:“带汉字”,如果参数值是汉字,则下一个显示参数值的页面出现乱码解决过程:将WebSphere的版本降下来,由于都是生产环境,暂时还没有找到相应的环境来找到问题所在。4.6 从数据库查出来的数据乱码现象:通过db2客户端工具插入的数据,程序读出来是乱码,而通过程序插入的数据,程序再读出来正常, 环境为AIX上

49、的DB2 8.2,Linux上的WebSphere 解决过程:在window客户端输入命令:db2set DB2CODEPAGE=,然后将数据库重建,并在建库的时候就指定字符集UTF-8 (命令如下:create database sccrm using codeset UTF-8 territory CN),然后再初始化数据,发现读出来的数据都正常了4.7 EOS+WebLogc9.2存在中文问题现象:将EOS的default应用和eosmgr应用发布到WebLogic9.2服务器上运行时,发现存在中文问题。解决过程:由于是WebLogic9.2对于通过include 引入的不能正常解析。将

50、eos4wl下面的两个应用default和eosmgr的配置文件weblogic.xml文件中分别加入如下内容即可 compileCommand javac compilerSupportsEncoding true encoding GBK 说明: 这种解决方案是通过修改编译器支持的编码集来实现支持GBK字符集的,因此如果已经安装eos4wl应用并且访问了部分页面(比如login1.jsp),由于Weblogic并不对他们进行编译,因此可能访问这些页面(比如login1.jsp)时还是出现乱码,需要停止Weblogic服务器,删除缓存,然后再启动服务器即可。4.8 IE中选择语言环境不一样现

51、象:有的浏览器输入的是正常,有的浏览器出现的是乱码解决过程:在IE菜单中点击“工具”,点击“语言”,出现如下窗口:如果语言环境不是“中文”,点击“添加”,选择中文环境4.9 业务逻辑中有事务控制时,事务区内requestContext内容向bizContext中传递时的乱码问题。现象:在业务逻辑中,增加了事务控制,事务中调用的运算逻辑被调用时,从requestContext中传入到运算逻辑的bizContext后,一些生僻字变成乱码,如:“王喆”传入后会变成“王?”。解决过程:由于虚拟机JVM启动后下面两个参数的默认值不是GBK,故需在运行环境的虚拟机JVM中启动参数中加入如下两个参数:-Dx

52、ml.encoding=GBK -Dfile.encoding=GBK针对不同运行环境,其参数调整方法如下:l 开发环境在EOS Studio中,可在“窗口首选项Primeton EOSServers参数列表”中的“虚拟机参数”中设置,如下图所示:l 生产环境针对WAS环境,可进入WAS管理台,在“应用程序服务器 serverEOS 进程定义 Java虚拟机”中的“一般 JVM 自变量”一项中加入上述参数,如下图:5 附录:常见字符集介绍5.1 编码问题的由来,相关概念的理解 从计算机对多国语言的支持角度看,大致可以分为三个阶段:系统内码说明系统阶段一ASCII计算机刚开始只支持英语,其它语言

53、不能够在计算机上存储和显示。英文 DOS阶段二ANSI编码(本地化)为使计算机支持更多语言,通常使用 0x800xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 中 在中文操作系统中,使用 0xD6,0xD0 这两个字节存储。不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的

54、文字,存储在同一段 ANSI 编码的文本中。中文 DOS,中文 Windows 95/98,日文 Windows 95/98阶段三UNICODE(国际化)为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Windows NT/2000/XP,Linux,Java字符串在内存中的存放方法:在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,Bob123 在内存中为:426F6231323300Bob1230在使用 ANSI 编码支持多种语言阶段,每个字

55、符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。比如,中文123 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:D6D0CEC431323300中文1230在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 中文123 在 Windows 2000 下,内存中实际存放的是 5 个序号:2D4E87653100320033000000 在 x86 CPU 中,低字节在前中文1230一共占 10 个字节。理解编码的关键,是要把字符的概念和字节的概念理解准确。这两个概念容易混淆,我们在此做一下区分:概念描述举例字符人们使用的记号,抽象意义上的一个符号。1, 中, a, $, ¥, 字节计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。0x01, 0x45, 0xFA, ANSI字符串在内存中,如果“字符”是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANSI 字符串或者多字节字符串。中

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!