点击这里给我发消息 点击这里给我发消息

网络应用程序支持中文的简单试验

添加时间:2013-12-7
    相关阅读: 开发 技术 数据库 网络 程序 SQL Windows

  这几天有些空闲,就对网络应用(Web Application)支持中文进行了一次简单的试验,现在总结一下。由于是第一次接触,错误难免,望指正帮助。
  
  试验方法是在数据库中建立一个表格,如student表,然后建立一个网络应用程序,对该表中的数据进行查询与编辑。结构是 Jsp——JavaBean——Controller——DAO,只用servlet(Jsp2.0?)技术。
  
  开发环境是Linux(平台缺省编码是UTF?8); 网络服务器TOMCAT5.0.28;数据库是PostgreSQL/MySQL。
  
  整个试验的思路是,从客户端(browser)到我的应用程序,再到数据库存取,如果所有过程均采用UTF?8编码的话,数据应保持完整性,即不应出现乱码问题。
  
  首先确定数据库支持UTF?8编码。利用数据库交互程序,往建好的表中直接写入中文数据,发现一切正常(你甚至不需要规定数据库编码为UNICODE, 可能是因为我的操作系统的缺省编码是UNICODE的原故)。
  
  这样看来,出现乱码的主要原因,可能在于应用程序的编写以及客户与服务器数据传输的过程。试验证明,对于从数据库中提取数据时,关键是在有关Jsp源文件头部声明应用程序的编码:<%@ page pageEncoding="UTF-8" %>.因Tomcat5在将Jsp编译时,其使用的缺省编码并非UNICODE, 因此就有可能造成数据丢失或错误。
  
  同样,在处理来自客户端的数据输入时,在拿参数之前,也要相应设好数据编码,以避免Tomcat用其缺省的编码来对数据流进行解释。试验中采用本站网友提出的办法,即用Filter的方式对请求的数据进行编码设定。经此处理后,其他相关源代码中对参数的获取己其他处理等,不需要作任何特别的处理。
  
  其简单源代码如下:
  
  import java.io.IOException;
  import javax.servlet.*;
  
  /**
  * a filter to set the coming request encoding to a desired charset.
  */
  public class EncodingFilter implements Filter {
  
  private static String desired_charset = "UTF-8";
  
  // gets defined encoding from web.xml
  public void init(FilterConfig conf) throws ServletException {
  desired_charset = conf.getInitParameter("charset");
  }
  
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
  throws IOException, ServletException {
  req.setCharacterEncoding(desired_charset);  // sets request encoding.
  chain.doFilter(req, res);
  }
  
  public void destroy() {}
  }
  
  //----------------------------------------------------------------
  //配置文件 "web.xml", showing the declaration of the above filter:
  
  <?xml version="1.0" encoding="ISO-8859-1"?>
  
  <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  version="2.4">
  
  <filter>
  <filter-name>Character Encoding Filter</filter-name>
  <filter-class>john.control.EncodingFilter</filter-class>
  <init-param>
  <param-name>charset</param-name>
  <param-value>UTF-8</param-value>
  </init-param>
  </filter>
  
  <filter-mapping>
  <filter-name>Character Encoding Filter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  ......
  
  </web-app>
  
  总结如下:
  
  1:网络应用程序支持中文的主要问题在于有些服务器(servlet container)的缺省编码不是UNICODE。
  2:解决的办法是通过对服务器的配置或在应用程序源代码中,指定希望采用的编码。
  3:在应用程序源代码中指定编码,主要在Jsp源文件中包括<%@ page pageEncoding="UTF-8" %>;而处理客户端所传数据时,可利用Filter来设定所需的编码。
  4:通过统一从客户端到数据库的编码为UNICODE,如UTF?8,同一个网络应用程序可以支持多种语言。
  5:改用MySQL数据库系统后,应用程序仍然工作良好。
  
  存在问题:
  
  由于好奇,将此网络应用程序部署到WindowsXP下进行调试,数据库与服务器均不变(当然是Windows版本)。程序运行良好。但由于此WindowsXP的缺省编"CP1521”(-:something like that),而并非UTF?8, 因此,通过数据库交互程序直接对数据库进行查询,Console输出乱码(PostreSql)。
  
  最后,告诉大家今年听到的一句话:“生活会让你失去自信的”。
咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册