JSP文字化け問題の解決策
2009-07-15 10:32
1. JSP ページが文字化けする理由は、ページ内で文字セット エンコーディングが指定されていないためです。解決策: ページの先頭で次のコードを使用して、文字セット エンコーディングを指定します。<%@ page contentType= "テキスト/html; charset=gb2312"?
2. データベースの文字化け このような文字化けは、データベースに挿入した漢字が文字化けしたり、データベースに挿入した漢字を読み取って表示したりするときにも文字化けしてしまいます。 :
エンコードされた文字セットをデータベース接続文字列に追加します (同じことがデータ ソース接続にも当てはまります)
文字列 URL="jdbc:mysql://localhost/digitalgulf?
ユーザー=root&パスワード=root&useUnicode=true&characterEncoding=GB2312";
そして、ページ内で次のコードを使用します。
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3. パラメータとして中国語を渡すと文字化けする 別のページにパラメータとして中国語を渡すと、文字化けが発生します。解決方法は次のとおりです。
RearshRes.jsp?keywords= + java.net.URLEncoder.encode(keywords) などのパラメータを渡すときにパラメータをエンコードします。
次に、受信パラメーター ページで次のステートメントを使用して、keywords=new String(request.getParameter("keywords").getBytes("8859_1")); を受信します。
文字化けの中心的な問題はやはり文字セットのエンコーディングの問題であり、これをマスターすれば、一般的なコードの文字化けの問題は解決できます。
------------------------------------------
Java と JSP に出会って以来、ずっと Java の中国語文字化けの問題に悩まされてきましたが、ついに完全に解決したので、その解決体験を皆さんと共有します。
1. Java中国語問題の原因
Java のコア ファイルとクラス ファイルは Unicode に基づいているため、Java プログラムはクロスプラットフォームに適していますが、中国語の文字化けという問題も発生します。主な理由は 2 つあります。1 つは Java および JSP ファイル自体のコンパイルによって引き起こされる文字化けの問題、もう 1 つは Java プログラムと他のメディアとの相互作用によって引き起こされる文字化けの問題です。
まず、Java (JSP を含む) ソース ファイルには中国語が含まれる可能性が高く、Java および JSP ソース ファイルの保存方法はバイト ストリームに基づいており、Java と JSP がクラス ファイルにコンパイルされる場合、使用されるエンコード方法は異なります。ソースファイルのエンコードが合っていないと文字化けが発生します。この種のコード化けを考慮すると、Java ファイルには中国語を記述しないことをお勧めします (コメント部分はコンパイルに関与しません。中国語を記述しなければならない場合は、パラメーターを使用して手動でコンパイルしてみてください)。 -ecoding GBK または -ecoding gb2312; JSP の場合、ファイルヘッダーに <%@ page contentType="text/html;charset=GBK"%> または <%@ page contentType="text/html;charset=gb2312"% を追加します。 > この種のコード化けの問題は基本的に解決できます。
この記事では、2 番目のタイプの文字化けコードに焦点を当てます。これは、Java プログラムが他のストレージ メディアと対話するときに生成される文字化けコードです。データベース、ファイル、ストリームなどの多くのストレージ メディアはバイト ストリームに基づいており、Java プログラムがこれらのメディアと対話するとき、たとえばページから文字 (char) とバイト (byte) の間の変換が行われます。投稿フォームで送信したデータがJavaプログラムで文字化けして表示される。
上記の変換処理で使用したエンコード方式が、元のバイトのエンコードと一致しない場合、文字化けが発生する可能性があります。
2. 解決策
人気のある Tomcat の場合、次の 2 つの解決策があります。
1) D:Tomcatconfserver.xml を変更し、ブラウザのエンコード形式を「簡体字中国語」に指定します。
その方法は、
<コネクタ ポート="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
EnableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />
タグ、太字は私が追加しました。
変更が成功したかどうかは、次のように確認できます。 変更を行う前に、ページが文字化けしている IE ブラウザで、メニュー「表示 | エンコード」をクリックすると、「西ヨーロッパ (ISO)」が選択されていることがわかります。変更後、メニューの「表示 | エンコード」をクリックすると、「簡体字中国語 (GB2312)」が選択されていることがわかります。
b) Java プログラムを更新します。私のプログラムは次のとおりです。
public class ThreeParams extends HttpServlet {
public void doGet(HttpServletRequest リクエスト、HttpServletResponse レスポンス)
ServletException、IOExceptionをスローします{
response.setContentType("text/html; charset=GBK");
...
}
}
太字フォントは必須であり、その機能はブラウザが Unicode 文字を GBK 文字に変換できるようにすることです。この方法では、ページの内容とブラウザの表示モードがGBKに設定されるため、文字化けは発生しません。
Tomcat での中国語に対する完全なソリューション
最近プロジェクトを開発しています。サーバーは Tomcat、オペレーティング システムは記事と意見ですが、ついに完成しました。しかし、良い記憶力は悪いペンほど優れているわけではないので、自分自身が忘れないようにするため、また同じ問題に遭遇した人に良い参考資料を提供するために書き留めました。
(1) JSP ページは中国語ですが、見ると文字化けしています。
解決策は、JSP ページのエンコーディングで <%@ page language="java" contentType="text/html;charset=GBK" %> を使用することです。これは、Jsp を Java ファイルに変換する際のエンコーディングの問題のためです。一部のサーバーのデフォルトは ISO-8859-1 です。中国語が JSP に直接入力された場合、Jsp がそれを ISO8859-1 として扱うことに間違いなく問題が発生します。これは、Jasper によって生成された Java 中間ファイルを見ることで確認できます。
(2) お客様から提出された中国語の文字コードをRequestオブジェクトを使用して取得すると、文字化けが発生します。
解決策は、サーブレット フィルターであるフィルターを構成することです。コードは次のとおりです。
インポート java.io.IOException;
インポート javax.servlet.Filter;
インポート javax.servlet.FilterChain;
インポート javax.servlet.FilterConfig;
インポート javax.servlet.ServletException;
インポート javax.servlet.ServletRequest;
インポート javax.servlet.ServletResponse;
public class CharacterEncodingFilter は Filter を実装します {
プライベート FilterConfig 構成。
プライベート文字列エンコーディング = "ISO8859_1";
public void destroy() {
System.out.println(config);
設定 = null;
}
public void doFilter(ServletRequest リクエスト、ServletResponse レスポンス、
FilterChain チェーン) IOException、ServletException をスローする {
request.setCharacterEncoding(エンコーディング);
//chain.doFilter(リクエスト, レスポンス);
chain.doFilter(リクエスト、レスポンス);
}
public void init(FilterConfig config) throws ServletException {
this.config = 構成;
文字列 s = config.getInitParameter("エンコーディング");
if (s != null) {
エンコーディング = s;
}
}
}
}
web.xmlを構成する
<フィルター>
<フィルター名>CharacterEncodingFilter</フィルター名>
<filter-class>com.SetCharacterEncodingFilter</filter-class>
</フィルター>
<フィルターマッピング>
<フィルター名>CharacterEncodingFilter</フィルター名>
<url-パターン>/*</url-パターン>
</フィルターマッピング>
この状況が依然として発生する場合は、フォームから送信されたデータが get を使用して送信されているかどうかを確認してください。そうであれば、通常、post を使用して送信しても問題はありません。 、4番目の解決策を見てください。
漢字を含む情報の処理もあります。処理コードは次のとおりです。
パッケージデータベースJavaBean;
パブリッククラスCodingConvert
{
publiccodingConvert()
{
//
}
public String toGb(String uniStr){
文字列 gbStr = "";
if(uniStr == null){
uniStr = "";
}
試す{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = 新しい文字列(tempByte,"GB2312");
}
catch(例外例){
}
gbStr を返します。
}
public String toUni(String gbStr){
文字列 uniStr = "";
if(gbStr == null){
gbStr = "";
}
試す{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = 新しい文字列(tempByte,"ISO8859_1");
}catch(例外例){
}
uniStr を返します。
}
}
直接変換を実行することもできます。まず、取得した文字列を ISO-8859-1 でエンコードし、そのエンコードをバイト配列に格納してから、その配列を文字列オブジェクトに変換します。
文字列 str=request.getParameter("女の子");
バイト B[]=str.getBytes("ISO-8859-1");
Str=新しい文字列(B);
上記の変換により、投稿された情報が正しく表示されるようになります。
(3) Formget リクエストがサーバー上で request.getParameter("name") を使用すると、文字化けが返されます。tomcat のメソッドに従ってフィルターを設定することは機能しません。または、request.setCharacterEncoding("GBK") を使用することも機能しません。問題は、パラメータ転送の処理方法に関して、サーブレットで doGet(HttpServletRequest request, HttpServletResponse) メソッドを使用して処理する場合、それが前に記述されている場合でも、次のとおりです。
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
それも機能せず、返された中国語は依然として文字化けしています。 ! !この関数を doPost(HttpServletRequest request, HttpServletResponse response) に変更すると、すべて問題なく動作します。
同様に、2つのJSPページを使用してフォーム入力を処理する場合、中国語が表示できるのは、postメソッドを使用して渡しているためで、getメソッドに変更しても機能しません。
サーブレットの doGet() メソッドや JSP の get メソッドを使用する場合は注意が必要であることがわかります。結局のところ、これにはブラウザを介してパラメータ情報を渡す必要があるため、一般的に使用される文字セットで競合や不一致が発生する可能性があります。
解決策は次のとおりです。
1) tomcat のserver.xml ファイルを開き、ブロックを見つけて次の行を追加します。
URIEncoding=”GBK”
完全なものは次のようになります。
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout=" true" URIEncoding="GBK"/>
2) Tomcat を再起動します。すべて問題ありません。
$TOMCAT_HOME/webapps/tomcat-docs/config/http.html にあるファイルを調べると、参加する必要がある理由がわかります。ここで UTF-8 を使用すると、送信プロセス中に Tomcat で文字化けが発生することに注意してください。それが機能しない場合は、別の文字セットに変更してください。
(4) JSP ページとボタンに漢字が含まれていますが、サーバー経由でページを表示すると文字化けが発生します。
解決策は次のとおりです。まず、ローカライズされたメッセージ テキストを JSP ファイルに直接含めず、テキストを <bean:message> タグを通じてリソース バンドルから取得する必要があります。中国語のテキストを Application.properties ファイルに配置する必要があります。このファイルは WEB-INF/classes/* に配置されます。たとえば、ページに名前と年齢の 2 つのラベルがある場合、最初にアプリケーションを作成する必要があります。内部のコンテンツは name="name" age="age" である必要があります。このファイルを WEB-INF/classes/properties/ に配置し、Application.properties ファイルに従ってエンコードして中国語リソース ファイルを作成します。 、名前が Application_cn.properties であると仮定します。 JDKでは文字エンコード変換を実現できるnative2asciiコマンドが提供されています。 DOS 環境で Application.properties ファイルを配置したディレクトリを見つけます。DOS 環境でコマンドを実行すると、GBK でエンコードされた中国語リソース ファイル Application_cn.properties が生成されます。上記のコマンドを実行すると、次の内容を含む Application_cn.properties ファイルが生成されます: name=u59d3u540d age=u5e74u9f84、Struts-config.xml で構成: <message-resourcesparameter="properties.Application_cn"/>。この時点で、基本的に半分以上が完了しました。次に、JSP ページに名前のラベルを記述する必要があります。この変更がページに表示されると、ボタン上の中国語の文字も同様に処理されます。
(5) データベースに書き込まれたコードが文字化けします。
解決策: サーブレット フィルターであるフィルターを構成します。コードは 2 回目と同じです。
JDBC 経由でデータベースに直接接続している場合、構成コードは次のとおりです: jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK これにより、データベース内のコードが文字化けしなくなります。
データ ソースを介してリンクする場合、上記の設定も適切です。中国語を入力すると、データベース内では <%@ ページも使用する必要があることに注意してください。データを表示するページ language="java" contentType="text/html;charset=GBK" %>このコード行。なお、フロントスタッフの中にはDreamverを使ってコードを書く人もいますが、注意すべき点が1つあり、それはDreamverでのActionの送信です。 JSP 送信には POST と GET の 2 つの方法があるため、リクエストを送信する必要があります。ただし、これら 2 つのメソッドによって送信されるコードは、エンコーディングの点で依然として大きく異なります。これについては後で説明します。
記事の概要:
ここでは主にjsp文字化け問題の解決方法について説明します。
1. 最も基本的な文字化けの問題。
PHPCE.CN、設計マニュアル
3. フォーム取得送信メソッドの文字化けの対処方法。
get メソッドを使用して中国語を送信すると、パラメーターを受け入れるページも文字化けして表示されます。このコードが文字化けする原因は、Tomcat の内部エンコード形式 iso8859-1 にもあります。 Tomcat は、get のデフォルトのエンコード方式 iso8859-1 を使用して中国語の文字をエンコードし、エンコード後に URL に追加します。その結果、ページから受け取ったパラメータが文字化けします。
解決:
A. 上の例の最初の方法を使用して、受信した文字をデコードしてからトランスコードします。
B. Get は URL 送信を使用し、URL を入力する前に iso8859-1 エンコードが実行されます。このエンコーディングに影響を与えるには、useBodyEncodingForURI="true" をserver.xml の Connector ノードに追加する必要があります。
属性設定は、get メソッドの Tomcat の中国語文字エンコード方法を制御できます。上記の属性は、request.setCharacterEncoding("UTF-8") で設定されたエンコード形式を使用してエンコードされる get 送信を制御します。したがって、自動的に utf-8 でエンコードされ、受付ページでは正常に受け付けられます。しかし、実際のエンコードプロセスは、Tomcat が D:Tomcatconfserver.xml を変更し、ブラウザのエンコード形式を「簡体字中国語」に指定する必要があると思います。
<コネクタポート="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
EnableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" URIEncoding="UTF-8"/> PHPCE.CNでは、設計マニュアルで設定したURIEncoding="UTF-8"が再度エンコードされますが、utf-8でエンコードされているため、エンコードされません。また何かが変わった。エンコードが URL から取得された場合、受信ページは URIEncoding="UTF-8" に従ってデコードされます。
これを追加する必要がある理由は、$TOMCAT_HOME/webapps/tomcat-docs/config/http.html にあるファイルを調べることでわかります。次のように、変更が成功したかどうかを確認できます。変更を行う前に、ページが文字化けします。 IE ブラウザで「表示 | エンコーディング」メニューをクリックすると、「西ヨーロッパ (ISO)」が選択されていることがわかります。変更後、メニューの「表示 | エンコード」をクリックすると、「簡体字中国語 (GB2312)」が選択されていることがわかります。
4. ファイルアップロード時の文字化けを解決する ファイルアップロード時のフォーム設定はenctype="multipart/form-data"となっています。このようにして、ファイルはストリーミング方式で送信されます。 Apach のアップロード コンポーネントを使用すると、文字化けしたコードが大量に見つかります。これは、apach の初期の commons-fileupload.jar にバグがあり、中国語の文字が取り出されてデコードされるためです。このメソッドが送信されるため、エンコードは Tomcat のデフォルトのエンコード形式 iso-8859-1 を自動的に使用します。ただし、文字化けの問題は、ピリオドやカンマなどの特殊記号が文字化けすることです。 漢字の数が奇数の場合は文字化けします。偶数の場合は正常に解析されます。 。
解決策: commons-fileupload-1.1.1.jar をダウンロードすると、このバージョンの jar はこれらのバグを解決しました。
ただし、コンテンツを抽出するときは、抽出した文字を iso8859-1 から utf-8 にトランスコードする必要があります。すべての通常の漢字と文字を取得できます。
5. URLリクエストに関するJavaコード、文字化けしたパラメータを受け取る
URL のエンコード形式は、上記の URIEncoding="UTF-8" によって異なります。 このエンコード形式が設定されている場合は、URL に対するすべての漢字パラメータをエンコードする必要があることを意味します。そうしないと、リンク Response.sendDerect ("/a.jsp?name=Zhang Dawei") のように、取得された漢字パラメータ値がすべて文字化けし、a.jsp で直接使用されます。
PHPCE.CN、設計マニュアル
String name = request.getParameter("name"); 文字化けが発生します。 utf-8でなければならないと規定されているので、リダイレクトは次のように書く必要があります。
Response.sendDerect("/a.jsp?name=URLEncode.encode("Zhang Dawei","utf-8"); のみ。
このパラメータ URIEncoding="UTF-8" が設定されていない場合はどうなりますか? 設定されていない場合は、デフォルトのエンコード形式 iso8859-1 が使用されます。再び問題が発生します。1 つ目は、パラメータ値の数が奇数の場合は正常に解析できますが、偶数の場合は最後の文字化けが発生します。また、最後の文字が英語の場合は正常に解析できますが、中国語の句読点は依然として文字化けします。便宜上、パラメーターに中国語の句読点がない場合は、パラメーター値の末尾に英語の記号を追加して文字化けの問題を解決し、パラメーターを取得した後に最後の記号を削除します。削ったり使用したりすることもできます。
6. URL リクエストに関しては、受信したパラメータが文字化けしている場合、スクリプト コードはページのリダイレクトも制御し、添付されたパラメータも関係し、受信ページ上のパラメータを解析します。この漢字パラメータが URIEncoding="UTF-8" で指定されたエンコード処理を行わない場合、受信ページで受信する漢字も文字化けします。スクリプトの処理とエンコードは面倒です。エンコード スクリプトに対応するファイルを用意し、そのスクリプト内でメソッドを呼び出して漢字をエンコードする必要があります。
7. MyEclipseで開いたjspの文字化け問題について 既存のプロジェクトの場合、Jspファイルの保存形式がutf-8になっている場合があります。 Eclipse を新しくインストールした場合、開くためにデフォルトで使用されるエンコード形式は iso8859-1 です。そのため、jspの漢字が文字化けしてしまいます。この文字化けしたコードは比較的簡単に解決できます。Eclipse3.1 の設定に移動し、[一般] -> [エディター] を見つけ、ファイルの開始エンコーディングを utf-8 に設定します。 Eclipse は新しいエンコード形式で自動的に再度開きます。漢字は正常に表示できます。
8. Eclipse で HTML ページを開いた時のコード化けについて ほとんどのページは Dreamweaver で作成されているため、保存形式が Eclipse の認識とは異なります。
通常、この場合は、Eclipse で新しい JSP を作成し、Dreamweaver からページのコンテンツを直接コピーして、JSP に貼り付けます。
PHPCE.CN、設計マニュアル
このコード化けの問題は、最も単純なコード化けの問題です。通常は新しいものが表示されます。これは、ページエンコーディングの不一致によって引き起こされる文字化けコードです。
<%@ ページ言語="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<頭>
<title>中国語の問題</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
</head>
<本文>
私は良い人です
</body>
</html>
3か所でコーディングします。
そもそもエンコード形式とは、jspファイルの保存形式のことです。 Ecljpse は、このエンコード形式に従ってファイルを保存します。そして、中に中国語の文字を含めて jsp ファイルをコンパイルします。
2 番目のエンコーディングはデコード形式です。 UTF-8で保存したファイルはiso8859-1にデコードされるため、中国語が入っていると確実に文字化けします。つまり、一貫性がなければなりません。 2位が位置するラインはそこにある必要はありません。デフォルトのエンコード形式も ISO8859-1 です。したがって、この行がないと、「私は良い人です」も文字化けしてしまいます。一貫性がなければなりません。
3 番目のエンコードは、ブラウザのデコード方法を制御することです。以前のデコードに一貫性があり、正しい場合は、エンコード形式は関係ありません。ブラウザーが使用するエンコード形式を判断できないため、一部の Web ページが文字化けして表示されます。ページがページに埋め込まれている場合があるため、ブラウザはエンコード形式を混乱させます。文字化けが発生します。 PHPCE.CN、設計マニュアル
2. Postメソッドでフォーム送信後に受信した文字化けの問題もよくある問題です。この文字化けしたコードは、Tomcat の内部エンコード形式 iso8859-1 によっても発生します。つまり、投稿の送信時に、送信されたエンコード形式が設定されていない場合、投稿は iso8859-1 メソッドで送信されますが、受け入れられた JSP が原因です。 utf-8 メソッドで受け入れられます。文字化けが発生します。このため、ここではいくつかの解決策と比較を示します。
A. パラメータを受け取る際のエンコーディング変換
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8"); この場合、各パラメータはこの方法でトランスコードされる必要があります。とても面倒です。しかし、確かに漢字を取得することはできます。
B. リクエスト ページの先頭で、リクエストされたエンコード コード request.setCharacterEncoding("UTF-8") を実行し、送信されたコンテンツの文字セットを UTF-8 に設定します。この場合、このパラメータを受け入れるページをトランスコードする必要はありません。直接使用する
String = request.getParameter("something"); 漢字パラメータを取得できます。ただし、この文はすべてのページで実行する必要があります。このメソッドは投稿の送信にのみ有効ですが、ファイルの送信およびアップロード時の enctype="multipart/form-data" の場合は無効です。 2つの文字化けについては後ほど個別に説明します。
C. 各ページに request.setCharacterEncoding("UTF-8") を書き込むのを避けるために、フィルターを使用して
エンコード処理を行います。この例はオンラインにたくさんあります。ご自身で確認してください