プロジェクト文字セットの概要


robbinは
MySQLデータベースの4.1は分岐点であり、4.1はUnicodeを直接サポートしているが、以下のバージョンはサポートされていない.
MySQL JDBC Driverの3.0.16も分岐点であり、3.0.16バージョンではデータベース自体の符号化が取られ、その符号化に従って変換されます.この方法はOracleのJDBC Driverと同じです.例えばあなたのデータベースがGBKコードであれば、JDBC Driverはデータベースから取り出した文字列をGBKに従ってunicodeに変換し、JVMに送ります.そのため、データベース自体の符号化を正しく設定することが特に重要です.
MySQL JDBC Driver3.0.16以下のバージョンはそうではありません.データベースの符号化に基づいてどのように変換するかをスマートに決定することはありません.ISO 8859-1がデフォルトで使用されています.そのため、characterEncoding=GBKを使用して、データベースから取り出した文字列をGBKに従ってunicodeに変換するように強制する必要があります.
したがって、どのデータベースバージョンを使用するかは、3.x、まだ4.0です.xは4.1です.x、実は私たちにとって重要ではありません.重要なのは2つあります.
1)データベースコードを正しく設定する、MySQL 4.0以下のバージョンの文字セットは、常にISO 8859-1、MySQL 4がデフォルトです.1インストール時に選択させます.UTF-8を使用する場合は、データベースの作成時にUTF-8を指定します(作成後も変更できますが、4.1以降はテーブルの文字セットを個別に指定することもできます).
2)3.0.16以上のJDBC Driverを使用すると、characterEncoding=UTF-8と書く必要はありません.
robbinのヒントに基づいて、プロジェクト内の文字セットの問題に関する基本的な解決策
 
使用環境はstruts 2+spring 2.5+hibernate 3.2である.DB用mysql 5.0
 
  • データベースの文字セットmysql 4.1以降は、テーブルの文字セットを設定できるので、テーブルの作成時に文字セットを設定することに注意してください.テーブルを作成するときに、次のコード
    character set =utf8;
  • を追加します.
  • hibernate読み書き文字セットここではspring+hibernateを使うのでdataSource beanを設定するときにデザインすればいい
    <property name="url" value="jdbc:mysql://localhost:3306/100see?useUnicode=true&amp;characterEncoding=utf8" />
  • webを追加します.xmlフィルタ
    フィルタ定義の書き込み
    サーブレットフィルタは、ユーザ要求とプロセッサとの間の1層のプロセッサであり、フィルタに関連付けられたURL要求と応答をチェックして修正することができる.サーブレットフィルタは、サーブレットが呼び出される前にRequestオブジェクトをチェックし、Request HeaderとRequestの内容を変更することができる.サーブレットが呼び出された後にResponseオブジェクトを確認し、Response HeaderとResponseの内容を変更します.サーブレットフィルタによってフィルタされるURLリソースは、サーブレット、JSP、HTMLファイル、またはパス全体の下の任意のリソースであってもよい.複数のフィルタは、フィルタに関連付けられたURLを要求すると、フィルタがこのプロセスを終了しない限り、フィルタチェーン上のフィルタが1つずつ機能するフィルタチェーンを構成することができる.
    異なる項目の文字セット設定は文字セットの混乱を招く可能性があるため、フィルタを設定することによってservlet間の文字セット変換の問題を完了することは多くの場合springのフィルタ
    <filter> 
      <filter-name>encodingFilter</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <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>
    を使用するが、springのフィルタはrequestに対して文字セットのフィルタを行うだけであることが分かった.そこで、独自のフィルタ
    package com.starweb.core.util;
    
    
    import java.io.IOException;
    
    
    
    
    
    import javax.servlet.Filter;
    
    
    import javax.servlet.FilterChain;
    
    
    import javax.servlet.FilterConfig;
    
    
    import javax.servlet.ServletException;
    
    
    import javax.servlet.ServletRequest;
    
    
    import javax.servlet.ServletResponse;
    
    
    
    
    
    public class EncodingFilter implements Filter {
    
    
    	
    
    
    	/**
    
    
    	 * The default character encoding to set for requests that pass through this
    
    
    	 * filter.
    
    
    	 */
    
    
    	protected String encoding = null;
    
    
    
    
    
    	/**
    
    
    	 * The filter configuration object we are associated with. If this value is
    
    
    	 * null, this filter instance is not currently configured.
    
    
    	 */
    
    
    	protected FilterConfig filterConfig = null;
    
    
    
    
    
    	/**
    
    
    	 * Should a character encoding specified by the client be ignored?
    
    
    	 */
    
    
    	protected boolean ignore = true;
    
    
    
    
    
    	// --------------------------------------------------------- Public Methods
    
    
    
    
    
    	/**
    
    
    	 * Take this filter out of service.
    
    
    	 */
    
    
    	public void destroy() {
    
    
    
    
    
    		this.encoding = null;
    
    
    		this.filterConfig = null;
    
    
    
    
    
    	}
    
    
    
    
    
    	/**
    
    
    	 * Select and set (if specified) the character encoding to be used to
    
    
    	 * intERPret request parameters for this request.
    
    
    	 * 
    
    
    	 * @param request
    
    
    	 *            The Servlet request we are processing
    
    
    	 * @param result
    
    
    	 *            The servlet response we are creating
    
    
    	 * @param chain
    
    
    	 *            The filter chain we are processing
    
    
    	 * 
    
    
    	 * @exception IOException
    
    
    	 *                if an input/output error occurs
    
    
    	 * @exception ServletException
    
    
    	 *                if a servlet error occurs
    
    
    	 */
    
    
    	public void doFilter(ServletRequest request, ServletResponse response,
    
    
    			FilterChain chain) throws IOException, ServletException {
    
    
    
    
    
    		// Conditionally select and set the character encoding to be used
    
    
    		if (ignore || (request.getCharacterEncoding() == null)) {
    
    
    			String encoding = selectEncoding(request);
    
    
    			if (encoding != null) {
    
    
    				request.setCharacterEncoding(encoding);
    
    
    				response.setContentType("text/html;charset="+encoding+"\"");
    
    
    			}
    
    
    //			System.out.println("requestEncoding : " + request.getCharacterEncoding());
    
    
    //			System.out.println("responseEncoding : " + response.getCharacterEncoding());
    
    
    		}
    
    
    
    
    
    		// Pass control on to the next filter
    
    
    		chain.doFilter(request, response);
    
    
    
    
    
    	}
    
    
    
    
    
    	/**
    
    
    	 * Place this filter into service.
    
    
    	 * 
    
    
    	 * @param filterConfig
    
    
    	 *            The filter configuration object
    
    
    	 */
    
    
    	public void init(FilterConfig filterConfig) throws ServletException {
    
    
    
    
    
    		this.filterConfig = filterConfig;
    
    
    		this.encoding = filterConfig.getInitParameter("encoding");
    
    
    		String value = filterConfig.getInitParameter("ignore");
    
    
    		if (value == null) {
    
    
    			this.ignore = true;
    
    
    		} else if (value.equalsIgnoreCase("true")) {
    
    
    			this.ignore = true;
    
    
    		} else if (value.equalsIgnoreCase("yes")) {
    
    
    			this.ignore = true;
    
    
    		} else {
    
    
    			this.ignore = false;
    
    
    		}
    
    
    
    
    
    	}
    
    
    
    
    
    	// ------------------------------------------------------ Protected Methods
    
    
    
    
    
    	/**
    
    
    	 * Select an appropriate character encoding to be used, based on the
    
    
    	 * characteristics of the current request and/or filter initialization
    
    
    	 * parameters. If no character encoding should be set, return
    
    
    	 * <code>null</code>.
    
    
    	 * <p>
    
    
    	 * The default implementation unconditionally returns the value configured
    
    
    	 * by the <strong>encoding</strong> initialization parameter for this
    
    
    	 * filter.
    
    
    	 * 
    
    
    	 * @param request
    
    
    	 *            The servlet request we are processing
    
    
    	 */
    
    
    	protected String selectEncoding(ServletRequest request) {
    
    
    
    
    
    		return (this.encoding);
    
    
    
    
    
    	}
    
    
    }
    
    
    
  • を実現することを提案する.
  • jsp文字セット問題jspページ設定UTF-8
    <%@ page language="java" pageEncoding="UTF-8"%>
  • struts 2文字セットstruts 2は文字セットを設定できます.デフォルトではiso-8859-1文字セットでstruts 2を設定します.xml
    <constant name="struts.i18n.encoding" value="UTF-8" />
    ps:struts 2の国際化に失敗することがあります.自分でfilterで文字セットを制御したほうがいいです.