フォーマット符号化jsp乱符号分析及び解決(1)
11612 ワード
この文章は友达が青岛で食事をしている时に突然思いついた...この间、フォーマットコードについて书きたい文章がいくつかありましたので、家に帰ってから、一生悬命书いて発表しました.
皆さんはウェブサイトの开発时によく文字化けの问题に出会うと思います.最近、自分がブログの小さな例を书いた时、また文字化けの问题に遭遇しました.普通は珍しいもので、よく探して、処理案がありますが、ネット上の大部分は直接処理案を贴っています.具体的な原因を指摘していません.だから、この2、3日、自分で文字化けに関する文章を见て、ゆっくりと手がかりがあって、リラックスして书きました.私は自分が出会った文字化けしの問題を一つ一つみんなに見せて、原因と処理方法を分析します.
もし間違いがあれば、皆さんも含めて、積極的に教えてください.一人の理解は往々にして無限で、甚だしきに至っては誤りがあって、群策群力は分析をもっと正確で、完備させることができます!
まずコードを見て、いくつかのコードを説明します.
最初の場所<%@page language="java"pageEncoding="gb 2312"%>は、ページの符号化フォーマットを指定し、jspファイルの格納フォーマットはこの符号化フォーマットであり、Eclipseはこの符号化フォーマットに基づいてファイルを保存する.中の漢字を含むjspファイルをコンパイルします.
2番目は復号フォーマットとして符号化される.gb 2312として保存されたファイルはiso 8859-1に復号されるため、中国語があれば必ず文字化けします.つまり分岐しなければならない.第2の行が存在しない場合、システムのデフォルトもiso 8859−1の符号化フォーマットを適用する.だからこの行がなければ、文字化けしてしまうこともあります.分岐しなければならない.
この行はjspページにおける文字がどのような符号化フォーマットで表現されるか、すなわち最終的に見られるページ内容の符号化フォーマットを担当する.
注意:<%@page language="java"pageEncoding="%>指定、<%@page contentType="text/html;charset="%>指定がなければ、一般的にiso 8859-1符号化フォーマットがデフォルトです.逆に、それらの符号化フォーマットは同じです.
3つ目は、ブラウザを制御する復号方法として符号化される.後の復号が分岐して誤りがなければ、この符号化フォーマットは設定しなくてもよい.ブラウザがどの符号化フォーマットを適用するか分からないため、文字化けが発生するページもあります.ページが埋め込まれることがあるため、ブラウザが符号化フォーマットを混同して文字化けしている.
注意:<%@page contentType="text/html;charset="%>ブラウザのエンコードフォーマットが指定されています.jspページでこれが指定されている場合、meta http-equiv="Content-Type"content="text/html charset=">は機能しません.jspに<%@page contentType="text/html;charset="%>がない場合にのみ機能します.両方が存在する場合は、<%@page contentType="text/html;charset="%>が優先されます.
次に本文に入ります.
シナリオ1:
jspページはformフォームでコミット(method="post")、servletファイルでrequestを利用する.getParameter(「パラメータ名」)は渡された値を失う.ここでは文字化けしが発生することが多い.
次の例の処理方法は正しいので、赤い字を見てください.
症結点:jspのcharset="utf-8"でvalue=new String(value.getBytes("ISO 8859_1")、"utf-8");この2つの場所の文字は分岐を維持しなければならない.
index.jsp
ConsumerServlet.java
String account = Chinese.toChinese(request.getParameter("account"));
consumerDao = new ConsumerDao(); ConsumerForm consumerForm = consumerDao.getConsumerForm(account); if(consumerForm==null){request.setAttribute("information","入力したユーザー名は存在しません.新しく入力してください!");else if (!consumerForm.getPassword().equals(request.getParameter(「password」)else { request.setAttribute("form", consumerForm); }//検証が通過した後、RequestDispatcher requestDispatcher=request.getRequestDispatcher("dealwith.jsp"); requestDispatcher.forward(request, response); }
Chinese.JAva(障害)
毎日同じ理屈
生活のしようがなくて、时には自分から源を発していないで、他の人の心のない筑就、それは1种の阴差阳间违いです.生活はもともと矛盾していて、昼と夜の間の距離、春夏秋冬の間の輪廻、そこで文句を言う愛があって、仕方なく喜びの待つことを加えました.
value = new String(value.getBytes("ISO8859_1"), "utf-8");
return value; }//ISO 8859で1の符号化フォーマットはvalueを読み出し、utf-8}catch(Exception){return";}}に変換する.
このコードはトランスコードを担当して、みんなは赤いコードに対してあまり知らないかもしれませんが、私はここでJAVA APIの解釈を貼ります:
public byte[] getBytes( String charsetName)
throws UnsupportedEncodingException
指定した文字セットを適用してStringをバイトシーケンスに復号し、結果を新しいバイト配列に格納します.
この文字列が指定された文字列で復号できない場合、このメソッドには指定された動作はありません.復号プロセスをさらに制御する必要がある場合、CharsetEncoderクラスが適用されるべきである.
パラメータ:
CharsetName-サポートされているcharset名
戻り値:
結果バイト配列
放出:
UnsupportedEncodingException-指定した文字セットがサポートされていない場合
public String(byte[] bytes,
String charsetName)
throws UnsupportedEncodingException
指定した文字セットを適用して指定したバイト配列を復号する新しいStringを構築します.新しいStringの長さは文字セット関数であるため、バイト配列の長さに等しくはなりません.
指定されたバイトが指定された文字の会合で無効な場合、この構造方法には指定された動作はありません.復号プロセスをさらに制御する必要がある場合、CharsetDecoderクラスが適用されるべきである.
パラメータ:
bytes-文字に復号するバイト
CharsetName-サポートされているcharsetの名前
放出:
UnsupportedEncodingException-指定した文字セットがサポートされていない場合
シナリオ2:
formフォームの別の形式(Submitを利用).
次のようなコミットページ(submit.jsp)です.
次は処理ページです
(process.jsp)
コード:
中国語を入力すると文字化けしが表示され、処理方法は同じです.
これでOKです.
分析:
tomcatはデフォルトでISO-8859-1の方法で数値を読み取るのですが、実際には中の文字コードはjspページのpageEncodingで指定されているはずです(一般的にiso-8859-1ではありません)、そうすると読み出し後に表現される符号化フォーマットと格納されているフォーマットが食い違いなく、文字化けが発生します.
私たちのトランスコードはちょうどこの問題を処理して、私たちはまずISO-8859-1フォーマットを適用して文字列を復号して、pageEncodingと相違する符号化フォーマットを利用してバイト配列を復号して、このように読み取ってから表現する符号化フォーマットと記憶するフォーマットを相違させて、文字化の問題を処理します.
ネット上で検索した別の処理方法:
リクエストでSeCharacterEncoding(「gb 2312」)は、要求を同一符号化する.
修正後のプロセスjspコードは以下の通りです.
テストを経て、この方法はだめですか、それとも文字化けして、どなたが解釈しますか???
未完待続~~~
この年のインターネットは本当に中国を娯楽して、ネットユーザー达は各种の“扉”の中からドリルして、また多くの“兄”の多くの“帝”があって、みんなが味わう価値があります......ネットの経典の语录、ITとインターネットに関连して、経典はあなたと分かち合います!
-------------------------------------------------------------------------------------------------------------------
皆さんはウェブサイトの开発时によく文字化けの问题に出会うと思います.最近、自分がブログの小さな例を书いた时、また文字化けの问题に遭遇しました.普通は珍しいもので、よく探して、処理案がありますが、ネット上の大部分は直接処理案を贴っています.具体的な原因を指摘していません.だから、この2、3日、自分で文字化けに関する文章を见て、ゆっくりと手がかりがあって、リラックスして书きました.私は自分が出会った文字化けしの問題を一つ一つみんなに見せて、原因と処理方法を分析します.
もし間違いがあれば、皆さんも含めて、積極的に教えてください.一人の理解は往々にして無限で、甚だしきに至っては誤りがあって、群策群力は分析をもっと正確で、完備させることができます!
まずコードを見て、いくつかのコードを説明します.
<%@ page language="java" pageEncoding="gb2312"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>JSP </title>
<meta http-equiv="Content-Type" content="text/html charset=gb2312">
</head>
<body>
<%out.print("JSP ");%>
</body>
</html>
最初の場所<%@page language="java"pageEncoding="gb 2312"%>は、ページの符号化フォーマットを指定し、jspファイルの格納フォーマットはこの符号化フォーマットであり、Eclipseはこの符号化フォーマットに基づいてファイルを保存する.中の漢字を含むjspファイルをコンパイルします.
2番目は復号フォーマットとして符号化される.gb 2312として保存されたファイルはiso 8859-1に復号されるため、中国語があれば必ず文字化けします.つまり分岐しなければならない.第2の行が存在しない場合、システムのデフォルトもiso 8859−1の符号化フォーマットを適用する.だからこの行がなければ、文字化けしてしまうこともあります.分岐しなければならない.
この行はjspページにおける文字がどのような符号化フォーマットで表現されるか、すなわち最終的に見られるページ内容の符号化フォーマットを担当する.
注意:<%@page language="java"pageEncoding="%>指定、<%@page contentType="text/html;charset="%>指定がなければ、一般的にiso 8859-1符号化フォーマットがデフォルトです.逆に、それらの符号化フォーマットは同じです.
3つ目は、ブラウザを制御する復号方法として符号化される.後の復号が分岐して誤りがなければ、この符号化フォーマットは設定しなくてもよい.ブラウザがどの符号化フォーマットを適用するか分からないため、文字化けが発生するページもあります.ページが埋め込まれることがあるため、ブラウザが符号化フォーマットを混同して文字化けしている.
注意:<%@page contentType="text/html;charset="%>ブラウザのエンコードフォーマットが指定されています.jspページでこれが指定されている場合、meta http-equiv="Content-Type"content="text/html charset=">は機能しません.jspに<%@page contentType="text/html;charset="%>がない場合にのみ機能します.両方が存在する場合は、<%@page contentType="text/html;charset="%>が優先されます.
次に本文に入ります.
シナリオ1:
jspページはformフォームでコミット(method="post")、servletファイルでrequestを利用する.getParameter(「パラメータ名」)は渡された値を失う.ここでは文字化けしが発生することが多い.
次の例の処理方法は正しいので、赤い字を見てください.
症結点:jspのcharset="utf-8"でvalue=new String(value.getBytes("ISO 8859_1")、"utf-8");この2つの場所の文字は分岐を維持しなければならない.
index.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
ConsumerServlet.java
//
public void checkConsumer(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
String account = Chinese.toChinese(request.getParameter("account"));
consumerDao = new ConsumerDao(); ConsumerForm consumerForm = consumerDao.getConsumerForm(account); if(consumerForm==null){request.setAttribute("information","入力したユーザー名は存在しません.新しく入力してください!");else if (!consumerForm.getPassword().equals(request.getParameter(「password」)else { request.setAttribute("form", consumerForm); }//検証が通過した後、RequestDispatcher requestDispatcher=request.getRequestDispatcher("dealwith.jsp"); requestDispatcher.forward(request, response); }
Chinese.JAva(障害)
毎日同じ理屈
生活のしようがなくて、时には自分から源を発していないで、他の人の心のない筑就、それは1种の阴差阳间违いです.生活はもともと矛盾していて、昼と夜の間の距離、春夏秋冬の間の輪廻、そこで文句を言う愛があって、仕方なく喜びの待つことを加えました.
public class Chinese {
public static String toChinese(String value) {
try {
if (value == null) {
return "";
} else {
value = new String(value.getBytes("ISO8859_1"), "utf-8");
return value; }//ISO 8859で1の符号化フォーマットはvalueを読み出し、utf-8}catch(Exception){return";}}に変換する.
このコードはトランスコードを担当して、みんなは赤いコードに対してあまり知らないかもしれませんが、私はここでJAVA APIの解釈を貼ります:
public byte[] getBytes( String charsetName)
throws UnsupportedEncodingException
指定した文字セットを適用してStringをバイトシーケンスに復号し、結果を新しいバイト配列に格納します.
この文字列が指定された文字列で復号できない場合、このメソッドには指定された動作はありません.復号プロセスをさらに制御する必要がある場合、CharsetEncoderクラスが適用されるべきである.
パラメータ:
CharsetName-サポートされているcharset名
戻り値:
結果バイト配列
放出:
UnsupportedEncodingException-指定した文字セットがサポートされていない場合
public String(byte[] bytes,
String charsetName)
throws UnsupportedEncodingException
指定した文字セットを適用して指定したバイト配列を復号する新しいStringを構築します.新しいStringの長さは文字セット関数であるため、バイト配列の長さに等しくはなりません.
指定されたバイトが指定された文字の会合で無効な場合、この構造方法には指定された動作はありません.復号プロセスをさらに制御する必要がある場合、CharsetDecoderクラスが適用されるべきである.
パラメータ:
bytes-文字に復号するバイト
CharsetName-サポートされているcharsetの名前
放出:
UnsupportedEncodingException-指定した文字セットがサポートされていない場合
シナリオ2:
formフォームの別の形式(Submitを利用).
次のようなコミットページ(submit.jsp)です.
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head><title>JSP </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form name="form1" method="post/get" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
次は処理ページです
(process.jsp)
コード:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
中国語を入力すると文字化けしが表示され、処理方法は同じです.
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
String s=new String(request.getParameter("name").getBytes("ISO-8859-1"),"gb2312") ;
out.print(s);
%>
</body>
</html>
これでOKです.
分析:
tomcatはデフォルトでISO-8859-1の方法で数値を読み取るのですが、実際には中の文字コードはjspページのpageEncodingで指定されているはずです(一般的にiso-8859-1ではありません)、そうすると読み出し後に表現される符号化フォーマットと格納されているフォーマットが食い違いなく、文字化けが発生します.
私たちのトランスコードはちょうどこの問題を処理して、私たちはまずISO-8859-1フォーマットを適用して文字列を復号して、pageEncodingと相違する符号化フォーマットを利用してバイト配列を復号して、このように読み取ってから表現する符号化フォーマットと記憶するフォーマットを相違させて、文字化の問題を処理します.
ネット上で検索した別の処理方法:
リクエストでSeCharacterEncoding(「gb 2312」)は、要求を同一符号化する.
修正後のプロセスjspコードは以下の通りです.
<%@ page contentType="text/html; charset=gb2312"%>
<%request.setCharacterEncoding("gb2312");%>
<html>
<head>
<title>JSP </title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
テストを経て、この方法はだめですか、それとも文字化けして、どなたが解釈しますか???
未完待続~~~
この年のインターネットは本当に中国を娯楽して、ネットユーザー达は各种の“扉”の中からドリルして、また多くの“兄”の多くの“帝”があって、みんなが味わう価値があります......ネットの経典の语录、ITとインターネットに関连して、経典はあなたと分かち合います!
-------------------------------------------------------------------------------------------------------------------