Web サーバーがクライアントの http リクエストを受信すると、リクエストを表すリクエスト オブジェクトと、リクエストごとの応答を表すレスポンス オブジェクトを作成します。リクエスト オブジェクトとレスポンス オブジェクトはリクエストとレスポンスを表すため、クライアントから送信されたデータを取得したい場合は、リクエスト オブジェクトを見つけるだけで済みます。クライアントにデータを出力するには、応答オブジェクトを探すだけです。
次のようにコードをコピーします。
パッケージcom.yyz.response;
インポート java.io.IOException;
java.io.OutputStreamをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
//中国語の出力に関する問題
パブリック クラス ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
文字列データ = "中国";
OutputStream out = 応答.getOutputStream();
out.write(data.getBytes());
/**
* out.write(data.getBytes()); このコードでは、コード テーブルを 2 回チェックします。
※「中国」が文字データからバイトデータに変更される場合、gb2312コードテーブルが参照されます。
※ブラウザにデータを送信して表示する場合は、再度コードテーブルを参照する必要があります。このとき参照するコードテーブルはブラウザの設定に関係します。
*/
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
ブラウザーのエンコードが GB2312 に設定されている場合のテスト結果:
ブラウザのエンコードが UTF-8 に設定されている場合のテスト結果:
外国人の方にもご覧いただけるよう、文字データをバイトデータに変換する際、変換コードテーブルをUTF-8に指定する必要があります。しかしこの時、GB2312でブラウザを開くとまた文字化けが発生します。このコードの文字化けの問題はブラウザの設定を変更することで解決できますが、ユーザー エクスペリエンスの向上にはつながりません。したがって、プログラムを使用して、データを表示するためにどのコード テーブルを参照するかをブラウザに指示する必要があります。
次のようにコードをコピーします。
パッケージcom.yyz.response;
インポート java.io.IOException;
java.io.OutputStreamをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
//中国語の出力に関する問題
パブリック クラス ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
//サーバー側では、データがどのコード テーブルから出力されるか、ブラウザがどのコード テーブルで開かれるかを制御する必要があります。
文字列データ = "中国";
response.setHeader("コンテンツタイプ", "text/html;charset=UTF-8");
OutputStream out = 応答.getOutputStream();
out.write(data.getBytes("UTF-8"));
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
もう 1 つのトリックを学びましょう:
HTML 言語の <meta> タグを使用して、ブラウザの動作を制御します。
<meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
http-equiv は HTTP 応答ヘッダーをシミュレートし、ブラウザーにそれを UTF-8 コード テーブルで開くように指示します。実際の応答ヘッダーは、http-equiv でシミュレートされた応答ヘッダーよりも優先されます。
実際の開発では、サーバーは文字ストリームを使用してテキスト データをブラウザに書き込む必要があります。ただし、応答の getWriter メソッドで取得される文字ストリームのデフォルトのコード テーブルは ISO8859-1 です。このコード テーブルには対応する中国語エンコーディングが存在しないため、変更されます。対応するエンコーディングがブラウザに送信され、ブラウザを開くと疑問符がいっぱいになります。データ送信時にサーバーが参照するコード テーブルは、応答の setCharacterEncoding を通じて変更できます。
次のようにコードをコピーします。
パッケージcom.yyz.response;
インポート java.io.IOException;
java.io.PrintWriterをインポートします。
インポート javax.servlet.ServletException;
インポート javax.servlet.http.HttpServlet;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
//中国語の出力に関する問題
パブリック クラス ResponseDemo extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
//サーバー側では、データがどのコード テーブルから出力されるか、ブラウザがどのコード テーブルで開かれるかを制御する必要があります。
文字列データ = "中国";
response.setHeader("コンテンツタイプ", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter 出力 = 応答.getWriter();
out.write(データ);
}
public void doPost(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
doGet(リクエスト, レスポンス);
}
}
ここで注意すべき細かい点がいくつかあります。
1. response.setCharacterEncoding("UTF-8"); を PrintWriter out = response.getWriter(); の前に記述する必要があります。文字ストリームを取得した後にエンコーディングを設定しても意味がありません。
2. response.setHeader("content-type", "text/html;charset=UTF-8"); もっと簡単に記述する方法もあります。
3.response.setContentType("text/html;charset=UTF-8"); このコードには実際には 2 つの機能があります。1 つは UTF-8 で出力するように応答を通知すること、もう 1 つは UTF-8 で開くようにブラウザに通知することです。これは、response.setHeader("content-type", "text/html;charset=UTF-8"); および response.setCharacterEncoding("UTF-8"); と同等です。
4. 上記を読むことで、読者はブラウザの response.getOutputStream.write(1); の出力が 1 ではない理由を理解できるはずです。ブラウザはテキストエディタなので、データを受け取った後、コード表を参照し、対応する文字を表示するのに 1 かかります。ブラウザに数値を出力したい場合は、response.getOutputStream.write((1+"").getBytes()); のように数値を文字列に変換する必要があります。
OutputStream (バイト ストリーム) を使用してデータを送信します。
1.response.getOutputStream().write("China".getBytes());//デフォルトのエンコーディングでデータを送信します
2.response.getOutputStream().write("China".getBytes("UTF-8"));//UTF-8 エンコードでデータを送信すると、ブラウザ (デフォルト GB2312) が文字化けして表示されます。
解決:
2.1 ブラウザのエンコード方式を変更する: IE/"View"/"Encoding"/"UTF-8" (推奨されません)
2.2 応答ヘッダーを設定して、クライアントにエンコード方式を通知します: response.setHeader("Content-type", "text/html;charset=UTF-8");//データ型とエンコードをブラウザに通知します。
2.3 メタ タグを使用してリクエスト ヘッダーをシミュレートします: out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4 次のメソッドを通じて: response.setContentType("text/html;charset=UTF-8");