1: フォームはポスト モードでフォアグラウンドでデータを送信します。
ブラウザがデータ (「中国」と仮定します) をサーバーに送信するとき、データを 0101 のバイナリ データ (98 99 と仮定します) に変換するときに、ブラウザがどのコード テーブルを使用してファイルを開くかを調べる必要があります。 Web ページでは、ブラウザーがどのコード テーブルでデータを送信するかを決定します。データがサーバーに到達した後、サーブレットでリクエストの getParameter メソッドを呼び出すと、メソッド内の数値を取得した後、データ (98 99) をリクエストにカプセル化する必要があります。リクエストの設計者が外国人であるため、デフォルトのクエリが ISO8859-1 になっており、これがリクエスト データの文字化けの原因となります。
次のようにコードをコピーします。
パッケージcom.yyz.request;
インポート java.io.IOException;
java.io.PrintWriterをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
// 投稿モードでフォームを送信する
パブリック クラス RequestDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
//リクエストデータの中国語文字化け問題
request.setCharacterEncoding("UTF-8");//クライアントの Web ページが UTF-8 になるように制御します。
文字列ユーザー名 = request.getParameter("ユーザー名");
//データの取得は正常です。データの出力時にさまざまなコード テーブルを確認できます
response.setCharacterEncoding("gb2312");//データ送信時に参照するコードテーブルをサーバーに通知します
response.setContentType("text/html;charset=gb2312");//どのコードテーブルを開くかをブラウザに通知します
PrintWriter 出力 = 応答.getWriter();
out.write(ユーザー名);
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
2: フォームは取得モードでフォアグラウンドでデータを送信します。
get メソッドで送信されたデータは、ブラウザーがデータを開くために使用するコード テーブルを使用して送信されます。違いは、get モードでデータを送信する場合、リクエスト設定のエンコーディングが無効になることです。 UTF-8が設定されている場合でも、ISO8859-1はチェックされます。 (??) を取得します。この問題を解決するには、(98 99) を取得した後、(??) を使用して ISO8859-1 を逆チェックする必要があります。
次のようにコードをコピーします。
パッケージcom.yyz.request;
インポート java.io.IOException;
java.io.PrintWriterをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
// get メソッド経由でフォームを送信する
パブリック クラス RequestDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
//リクエストデータの中国語文字化け問題
request.setCharacterEncoding("UTF-8");//getモードでデータを送信する場合、リクエスト設定のエンコーディングが無効になります。 UTF-8が設定されている場合でも、ISO8859-1はチェックされます。
文字列ユーザー名 = request.getParameter("ユーザー名");
System.out.println(ユーザー名);
バイトソース [] = ユーザー名.getBytes("iso8859-1");
ユーザー名 = 新しい文字列 (ソース、"UTF-8");
System.out.println(ユーザー名);
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
三:入稿データにおける中国語文字化け問題の概要:
1. 送信方法がpostの場合、文字化けを避けたい場合はリクエストオブジェクトのエンコーディングを設定するだけで済みます。
注: クライアント データがどの方法で送信されるかは、リクエストをどのエンコーディングに設定する必要があるかによって異なります。
2. 送信メソッドが get の場合、リクエストオブジェクトのエンコーディングの設定は無効です。文字化けを避けたい場合は、手動で変換するしかありません。
文字列データ = "???????";//文字化け
byte source [] = data.getBytes("iso8859-1");//クライアントから送信された元のデータを取得します
data = new String (data.getBytes("iso8859-1"),"UTF-8");//文字化けを解決
//等しい
データ = 新しい文字列 (ソース、"UTF-8");
3. get メソッドのコード化けは、サーバーの構成を変更することでも解決できます。 Tomact の conf ディレクトリにあるserver.xml ファイルを変更します。
3.1
このアプローチはサーバーを変更し、柔軟性に欠けるためお勧めできません。
3.2
この設定の後は、リクエストの setCharacterEncoding で設定されたエンコーディングがコネクタによって使用されますが、以前の変更よりも柔軟ですが、アプリケーションがサーバーにしっかりと依存することになるため、お勧めできません。
4: 最後に、細かい点について触れておきます。URL アドレスの後に中国語のデータが続く場合は、URL エンコードする必要があります。フォームで送信されたパラメータには中国語のデータが含まれており、ブラウザは自動的にそのエンコードを支援しますが、中国語のパラメータがリンクを通じて直接取得された場合、ブラウザはそのエンコードを支援しません。上記の 2 番目の方法による中国語の文字化けの問題は、最初に URLEncoding.encode(,"UTF-8") でエンコードする必要があります。