JSP文字化けし問題及び解決方法


文字化け問題の思考と解決方法一、文字化けを引き起こす原因は:1、応答中の文字化け:すなわちindexのようなページ上の文字化けを表示する.jspが表示する場合、「ユーザ名」は文字化けして表示される2、フォームの提出時の文字化けして表示される:すなわち、フォームのテキストボックスに中国語と入力されたときにサービスに提出する文字化けして表示される2、各原因に対する解決の考え方及び方法:1、応答中の文字化けして表示される:説明:(1).一般的な符号化方式:ISO-8859-1、GB 18030、GB 2312、UTF-8;(2)pageEncodingの意味:pageEncodingはこのJSPページの符号化を表しています.つまり、あなたがJSPページを保存すると、システムはこの符号化で保存します(テキストファイルが別途保存されていることを知っているときにヒントウィンドウがポップアップします.注意すると、元は異なる「符号化」を選択して保存することができます).JSPファイルがデフォルトで保存されると、あなたが設定したpageEncodingの属性値でこのJSPページが保存されます.EclipseでWindowpreferencesjsp files面版のEncodingがGB 2312のような値に設定されている場合、後でJSPファイルを新規作成するとpageEncoding=「GB 2312」という属性が自動的に追加されます.注意:pageEncoding=「ISO-8859-1」の場合は中国語を保存できません.つまり、ISO-8859-1に設定した場合、JSPファイルに中国語を書きたい場合、保存できない旨のメッセージが表示されます.(3)JSP実装プロセス:クライアントがURL要求を提出する例:www.WebTest.com/index.jspサーバが要求サーバを受信ローカルファイルindexを探す.jspサーバはindex.jspをindexに変換する.JAva再コンパイルindex_jsp.classファイルは、クライアントブラウザに応答として実行するHTMLコードを解釈して表示するものであり、応答中の文字化けし問題を解決するには、I、ローカルファイルindexの3点に注意する.jspのpageEncodingプロパティチェックは、サーバがリクエストを受けた後、まずこのファイルを探しているためです.PageEncodingはGB 18030、GB 2312、UTF-8 II、JSPに<%@page contentType="text/html;charset=GB 2312"%>を用いて符号化情報を追加することができ、ここでcharset="ISO-8859-1"であれば、表示される中国語は文字化けに違いない.III、にを加えることを覚えておいてください.この文はの後の最初の文であるべきです.ここでのcharset値はcontentTypeのcharset値と一致することが望ましい.上記の3つのステップで、文字化けして表示されるページに文字化けしがある場合を解決します.2、フォーム提出の文字化けし:説明:(1)フォームのテキストボックスに中国語で入力時にサービスに提出して文字化けした主な原因は、フォーム提出即ち送信要求の過程で使用するコードがISO-8859-1である.フォームの提出方式はPOSTとGETがあるので、フォームの提出文字化けしはPOST文字化けしとGET文字化けしI、POST文字化けし解決方法はJSPページに文を入れる:<%request.setCharacterEncoding("UTF-8"); %> II、GET乱符号化POST方式での解決方法は簡単で、POST方式で提出されたデータはすべてhttp要求のbody部分にバイナリで添付されて送信されるので、バックグラウンドで符号化フォーマットを指定するだけで十分です.GET方式ではurlの後に直接パラメータが付加する、このパラメータはrequestを使用できない.setCharacterEncoding()処理の結果,get形式のすべての中国語が文字化けしてしまう.ここでは、コミットされたコンテンツをバイトに変換する、さらに別の符号化文字に変換することしかできない:<%String username=request.getParameter("username");byte[] bytes = username.getBytes("iso-8859-1");String result = new String(bytes, "gb2312");out.print(result);%>理解は簡単です.まず、既存の符号化とは異なる符号化文字列を取得します.Stringクラスの構造関数:new String(byte[],charset ch);では、元の文字列を変換して文字列からバイト配列に変えるバイト配列が必要です.StringクラスのgetBytes(charset ch)関数ですから、new String(username.getBytes(「iso-8859-1」)、「gb 2312」);
 
参照リンク:http://www.family168.com/tutorial/jsp/html/jsp-ch-02.html
 
postフォームをコミットするときにfilterの具体的なコードを使用する場合があります.
package com.lwf.struts.filter;

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 CharacterEncodingFilter implements Filter {

	private String encoding;
	private FilterConfig config;
	
	public void destroy() {
		this.encoding = null;
		this.config = null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

			request.setCharacterEncoding(encoding);
			chain.doFilter(request, response);
	}

	public void init(FilterConfig flterConfig) throws ServletException {

		this.config = flterConfig;
		encoding = config.getInitParameter("encoding");
	}

}

Webでxmlで作成:
<filter>
		<filter-name>characterEncoding</filter-name>
		<filter-class>com.lwf.struts.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>