1. ホーム
  2. Web プログラミング
  3. JSP プログラミング

JSP中国語文字化けコード問題解決法詳細

2022-01-18 16:23:10

我々は最初の特定の問題について明確にする必要があります前に、メソッドの導入では、JSPの中国の文字化け問題でこのブログの著者は、次のとおりです:ページ文字化け、パラメータ文字化け、フォーム文字化け、ソースファイルが文字化けしています。ここでは、これらの問題を一つずつ解決する方法です。

I. JSPページ 中国語文字化けしたコード

JSPページでの中国語表示文字化けは、HTMLでの中国語表示文字化け、JSPで動的に出力される中国語表示文字化けの2種類があります。

まず、JSPのプログラムから見てみましょう。

<%@ page language="java" import="java.util.*" %>
<html>
	<head>
	<title>Chinese display example</title>
 
	</head> 
	<body>
	This is an example of a Chinese display.
	<%
		String str = "Chinese";
		out.print(str);
 	%>
	</body>
</html>

上記のJSPプログラムは、ページ上に中国語の文章がいくつか表示され、タイトルも中国語で表示されているように見えます。実行すると、ブラウザ上では次のように表示されます。

この原因は、ページ表示のエンコーディングがJSPで指定されていないためで、文字化けを解消する方法は簡単で、上記のコードのページコマンドを次のように修正すればよいのです。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312" %>
<html>
	<head>
	<title>Chinese display example</title>
 
	</head> 
	<body>
	This is an example of a Chinese display.
	<%
		String str = "Chinese";
		out.print(str);
 	%>
	</body>
</html>

もう一度実行すると消えます。原理は、ページへのエンコーディングをGB2312と指定すると、このエンコーディングに従ってページが表示されるため、ゴミが消えるというものです。

2. 中国語のパラメータを渡すURLが文字化けする

一般的に、getメソッドでフォームを送信する際に渡されるパラメータが中国語の場合、文字化けする可能性が高いです。

以下はサンプルアプリケーションです。

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<html>
	<head> 
		<title>URL passing parameter Chinese processing example</title>
	</head>
	<%
		String param = request.getParameter("param");
	%>
	<body>
		<a href="URLCharset.jsp?param='Chinese'" rel="external nofollow" >Please click this link </a><br>
		You submitted the parameters as:<%=param%>
	</body>
</html>

上記のJSPプログラムの機能は、中国語の文字列であるパラメータをURLリンクで自分自身に渡すというもので、プログラムは次のように実行されます。

URLは、中国語のパラメータは、この問題を混乱渡すために、その処理方法はかなり特殊で、単にこの中国の文字列を変換したり、JSPページの表示エンコーディングを設定することはできません、問題を解決するために、Tomcatサーバの設定ファイルを変更する必要があります。ここでは、Tomcatのconfディレクトリ内のserver.xml設定ファイルを変更すると、特定のコードは、次のように変更されます。

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="gb2312"
    connectionTimeout="20000" 
    redirectPort="8443" />

元のコードにURIエンコーディングを追加してURI Encoding="gb2312"とし、Tomcatサーバーを再起動すると、正しいページが表示されるようになります。原理は上記のケースと同様で、つまり、プログラムにエンコーディングの種類を指定すると、表示がうまくいくのです。

三、フォームから中国語の乱雑なコードが送信される

request.getParameter("")メソッドでフォームデータを取得できますが、フォームに中国語データがある場合は文字化けします。

サンプルコードは以下の通りです。

<%@ page language="java" import="java.util.*" contentType="text/html;charset=gb2312"%>
<html>
	<head> 
		<title>Form Chinese processing example</title>
	</head> 
	<body>
		<font size="2">
				Here is the form content.
			<form action="AcceptFormCharset.jsp" method="post">
				User name: <input type="text" name="userName" size="10"/>
				Password: <input type="password" name="password" size="10"/>
				<input type="submit" value="submit">
			</form> 
		</font>
	</body>
</html>

上のフォームでは、AcceptFormCharsetがこのページで2つのデータを上げるようにしたい。以下はAcceptFormCharset.jspの内容である。

<%@ page language="java" import="java.util.*"
	contentType="text/html;charset=gb2312"%>
<html>
	<head>
		<title>FormChinese mess</title>
	</head>
	<body>
		<font size="2"> Here is the form data fetched with request after the form is submitted: <br>
			<%
				String userName = request.getParameter("userName");
	 			String password = request.getParameter("password");
	 			out.println("Form input value of userName:" + userName + "<br>");
	 			out.println("The value of form input password:" + password + "<br>");
 			 %> 
 		</font>
	</body>
</html>

上記のプログラムでは、フォーム入力に中国語がない場合は正常に表示されます。 入力データに中国語がある場合は、図のような結果が得られます。

このような結果になった原因は、Tomcatがpostメソッドで送信するフォームのデフォルトのエンコーディングがISO-8859-1であり、このエンコーディング形式が漢字に対応していないためです。この問題は、エンコード形式を変換することで解決できるため、現在ではAcceptFromCharsetのページを以下のように変更しています。

<%@ page language="java" import="java.util.*"
	contentType="text/html;charset=gb2312"%>
<html>
	<head>
		<title>FormChinese mess</title>
	</head>
	<body>
		<font size="2"> Here is the form data fetched with request after the form is submitted: <br>
			<%
				String userName = request.getParameter("userName");
	 			String password = request.getParameter("password");
	 			out.println("Form input value of userName:" + new String(userName.getBytes("ISO-8859-1"), "gb2312") + "<br>& quot;);
	 		 	out.println("Form input password value:" + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>& quot;); + new String(password.getBytes("ISO-8859-1"), "gb2312")+ "<br>& quot;);
 			 %> 
 		</font>
	</body>
</html>

このエンコーディング変換の後、すべての中国語入力はリクエストオブジェクトで正常に取得できるようになります。上記のプログラムでは、4行目と5行目がエンコード形式を変換するキーとなっており、まずISO-8859-1形式の文字列からバイト内容を取り出し、GB2312エンコード形式の文字列を新たに再構成しています。これにより、中国語のフェードインプットの正常な取り込みと表示をサポートすることができます。改良したプログラムの結果は以下のとおりです。

上記のエンコード形式を変更したところ、フォームの中国語入力の文字化けが解消されました。しかし、上記のフォームに2つ以上の入力項目がある場合、それぞれの入力項目をエンコードする必要があり、大変な作業となる。そこで、有名なfilterfilterを利用する。ここでの一般的な考え方は上記と同じなので、私の別の記事を参照してください。

IV. EclipseでのJSPファイル中国語の混乱

EclipseやMyEclipseでは、JSPのエンコード形式がデフォルトでISO-8859-1なので、他のエディターで編集したJSPファイルを開くと、図のように文字化けしてしまうのです。

この問題を解決するには、EclipseまたはMyEclipseでJSPのデフォルトエンコーディングを変更すればよいのです。

PS

EclipseやMyEclipseのJSPファイルのデフォルトエンコーディングはISO-8859-1なので、JSPコードの途中に中国語が現れると保存できません、例えば次のようなコードです。

<%@ page language="java" import="java.util.*" %>
<html>
	<head>
	<title>Chinese display example</title>
 
	</head> 
	<body>
	This is an example of a Chinese display.
	<%
		String str = "Chinese";
		out.print(str);
 	%>
	</body>
</html>

この修正により、保存時に以下のようなプロンプトが表示されます。

このプロンプトが表示される理由は、JSPソースファイルにISO=8859-1エンコーディングで認識できない漢字が含まれているためで、この問題の解決には、JSPページでページエンコーディング形式を宣言する必要があります。宣言されたコードは次のとおりです。

<%@ page language="java" import="java.util.*" pageEncoding="GB2312" %>
<html>
	<head>
	<title>Chinese display example</title>
 
	</head> 
	<body>
	This is an example of a Chinese display.
	<%
		String str = "Chinese";
		out.print(str);
 	%>
	</body>
</html>

1行目の pageEncoding="gb2312" は、JSPページのエンコードがGB2312であることを指定し、JSPソースファイルが正しく保存できるようにするためのものです。

問題に遭遇したとき、まずその原因を分析する。原因がわかって初めて解決できるのであって、原因を分析することを学ぶことは、問題を解決することよりもはるかに重要なことなのです。

文字化け問題の原因は、プログラム(Eclipseやブラウザ)のコードとプログラマーのコードが統一されていないことなので(中国語がわからない人と中国語でコミュニケーションしても、当然わからないのと同じ)、この問題の解決策は、プログラマーが欲しいコードを伝えればいいだけなのです。つまり、文字化けしたコードの問題に対する究極の解決策は、「トランスコード」です。つまり、中国語がわからないなら、中国語を勉強させるか、彼の言語を勉強するか、どちらかです。

人生はプログラミング、プログラミングは人生、同じことだ、徹頭徹尾!!!!

この記事JSP中国語文字化けコード問題解決に導入され、より多くの関連JSP中国語文字化けコード問題解決の内容は、スクリプトホーム前の記事を検索してくださいまたは次の関連記事を閲覧し続け、あなたが将来的にスクリプトホームをよりサポートすることを願って!.