J2EE项目开发中如何正确地进行中文乱码问题的处理方法
- 格式:pdf
- 大小:192.87 KB
- 文档页数:7
1.1J2EE项目开发中如何正确地进行中文乱码问题的处理1、问题的起源(1)字符编码集每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312-80,日本的 JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。
字符编码集按长度分为 SBCS(单字节字符集),DBCS(双字节字符集)两大类。
(2)Unicode编码集及本地化转换现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础的,在软件运行时根据当时的 Locale/Lang/Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符。
在处理过程中需要实现 Unicode 和本地字符集的相互转换,Java 语言内部是用 Unicode 表示字符的,遵守 Unicode V2.0。
Java 程序无论是从/往文件系统以字符流读/写文件,还是往 URL 连接写 HTML 信息,或从 URL 连接读取参数值,都会出现有字符编码的转换。
(3)为什么会出现乱码从理论上来说,这些根据Unicode字符集设置而进行的向本地字符集进行转换的工作不应该产生太多问题。
而事实是由于应用程序的实际运行环境不同,Unicode 和各个本地字符集的补充、完善,以及系统或应用程序实现的不规范,转码时出现的问题时时困扰着程序员和用户。
因此,如果能统一Java系统的输入、输出和操作系统三者的编码字符集合,将能够使Java 系统正确处理和显示汉字。
这是处理Java系统汉字的一个原则,但是在实际项目中,能够正确抓住和控制住Java系统的输入和输出部分是比较难的。
J2EE中,由于涉及到外部浏览器和数据库等,所以中文问题乱码显得非常突出。
J2EE应用程序是运行在J2EE容器中。
在这个系统中,输入途径有很多种:一种是通过页面表单打包成请求(request)发往服务器的;第二种是通过数据库读入;还有第3种输入比较复杂,JSP在第一次运行时总是被编译成Servlet,JSP中常常包含中文字符,那么编译使用javac时,Java将根据默认的操作系统编码作为初始编码。
输出途径也有几种:第一种是JSP页面的输出。
由于JSP页面已经被编译成Servlet,那么在输出时,也将根据操作系统的默认编码来选择输出编码,除非指定输出编码方式;还有输出途径是数据库,将字符串输出到数据库。
正是由于Java的跨平台特性,使得字符集问题必须由具体系统来统一解决,所以在一个Java应用系统中,解决中文乱码的根本办法是明确指定整个应用系统统一字符集。
2、了解Web应用中的数据流其中容易出现乱码的节点是在浏览器----Web服务器,实体EJB组件----数据库系统。
3、Html和JSP页面中的中文字符串的处理(1)静态HTML页面中文信息不能正确显示浏览器端看到中文不能正确显示,首先用户应该检查浏览器是否支持中文,浏览器的编码是否设置为正确的编码。
为保证静态页面中文信息正确显示可以在HTML的 <HEAD>标签部分增加如下的标签:<meta http-equiv="Content-Type" content="text/html" charset="GBK">或者:要将 contentType 字符集参数添加到 HTTP 头中以提供 HTML 文件,请在 web.xml 文件中插入下列定义,这些定义可以为 HTML 文件显式指定编码:<mime-mapping><extension>html</extension><mime-type>text/html;charset=GB2312</mime-type></mime-mapping>这允许您通过使用如下所示的 META 标记来忽略 HTML 文件中的字符集设置:<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=GB2312"> (2)JSP页面的中文提示信息在浏览器端不能正确显示●JSP里的中文提示信息不能正常显示,最直接的原因是服务器如WebLogic的默认字符集不是中文字符集(在默认情况下,将使用ISO-8859-1 编码),因此可以在JSP页面中设置字符集,加入如下标签:<%@ page contentType="text/html; charset=GBK" %>同时为使浏览器能正确显示中文,应在HTML <HEAD> 部分增加:<meta http-equiv="Content-Type" content="text/html" charset="GBK">●为避免在每个JSP页面中都进行上面的page指令的设置,可以在weblogic.xml文件的<jsp-descriptor>部分加入注意:在JBuilderX中可以利用可视化的方式来进行设置,最终将产生如下的结果标签。
<jsp-descriptor><jsp-param><param-name>compilerSupportsEncoding</param-name><param-value>true</param-value></jsp-param><jsp-param><param-name>encoding</param-name><param-value>GBK</param-value></jsp-param></jsp-descriptor>(3)静态包含<%@ include file="relativeURL" %>如果要静态包含 JSP 文件,则不能在源 JSP 和目标 JSP 中同时指定 page 指令的contentType 值。
由于不符合 J2EE JSP 规范,这会导致编译错误。
请将 weblogic.xml 中的"backwardCompatible"设置为 True。
<!-- 将 jspServlet 参数注释掉以恢复到 weblogic 的 jspc --><!—<jsp-param><param-name>jspServlet</param-name><param-value>weblogic.servlet.WlwJSPServlet</param-value></jsp-param>--><jsp-param><param-name>backwardCompatible</param-name><param-value>true</param-value></jsp-param>4、HTTP请求中的中文字符串的处理(1)原因由于在默认的情况下,浏览器发送请求采用“ISO-8859-1”的字符编码。
(2)采用前端Filter进行统一转换如果需要转换的组件比较多的场合request.setCharacterEncoding("GB2312");(3)在某一组件(JSP页面或者Servlet)中进行如下的编码方法的转换request.setCharacterEncoding("GB2312");该方法符合 Servlet 2.3 规范。
因此,可以实现应用程序可移植性。
(4)也可以采用如下的方法对所接受的参数进行编码转换String clientData=request.getParameter("clientData");if(clientData !=null){clientData=new String(clientData.getBytes("ISO-8859-1"),"GB2312");}(5)也可以在web.xml文件中加入如下的设置项目这样可以统一对整个网站进行设置<context-param><param-name>weblogic.httpd.inputCharset./*</param-name><param-value>GBK</param-value></context-param>5、HTTP响应中的中文字符串的处理(1)利用setContentType()处理HTTP响应,要为由 Servlet 生成的 HTML 页面指定编码。
因此,在获得写入器之前,必须先调用 setContentType()。
response .setContentType("text/html;charset=GBK ");PrintWriter out = response.getWriter();(2)或者在WebLogic.xml中进行如下的设置<container-descriptor><default-mime-type>text/html</default-mime-type></container-descriptor>6、有关数据库中的数据读写时的中文字符串的处理(1)处理从数据库中读出数据的中文编码问题1)如果数据库系统的字符编码为“GB2312”,则直接可以读出而无需要进行转换。
2)如果数据库系统的字符编码为“ISO-8859-1”,那么必须先对来自数据库的数据进行转换,然后才能使用。
while(rs.next()){String userName= rs.getString("userName");userName= new String(userName.getBytes("ISO-8859-1"),"GB2312");}(2)处理向数据库写入数据的中文编码问题userName= new String(userName.getBytes("GB2312")," ISO-8859-1");在本项目中的具体的应用问题的解决方法请见本项目中的用户注册等功能模块7、有关文件名称时的中文字符串的处理(1)处理XML文件中的中文编码如果在XML文件中包含有中文,可以将XML文件的字符编码设置为“GB2312”。