ディスカッション フォーラムで、JSP で表示される中国語の文字が文字化けする場合はどうすればよいか、リクエストを通じて取得したユーザーの中国語入力が文字化けするのはなぜなのか、データベースに書き込む中国語の文字が文字化けするのはなぜなのか、などの質問をしている人をよく見かけます。漢字の文字化けについての質問です。
実際、この問題は非常に単純です。漢字、日本語、その他の 2 バイト言語に関係なく、UTF-8 として扱います。
(1) リクエスト内の 2 バイト テキストは適切です。ここで、アプリケーション全体で UTF-8 エンコーディングを使用することにします。これは、Java がベースになっている理由だけではありません。 UTF-8 以降なので、UTF-8 を選択するのが正しいはずです^_^
まず、.java および .jsp ファイルを UTF-8 エンコーディングで保存します。以前のファイルが UTF-8 で保存されていなくても問題ありませんが、今後のファイルはすべて UTF-8 で保存することをお勧めします。
そして、.jsp に < %@page contentType="text/html; charset=UTF-8"%> の代わりに < %@page contentType="text/html; charset=UTF-8"%> と記述します。
次に、次の段落を web.xml に追加します。
<ウェブアプリ>
...
<フィルター>
<filter-name>文字エンコーディングの設定</filter-name>
<filter-class>com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter</filter-class>
<初期パラメータ>
<param-name>エンコーディング</param-name>
<param-value>UTF-8</param-value>
</init-param>
</フィルター>
<フィルターマッピング>
<filter-name>文字エンコーディングの設定</filter-name>
<url-パターン>/*</url-パターン>
</フィルターマッピング>
...
com.redv.projects.eduadmin.util.filters.SetCharacterEncodingFilter
のコードは次のとおり
です
。
インポート javax.servlet.Filter;
インポート javax.servlet.FilterChain;
インポート javax.servlet.FilterConfig;
インポート javax.servlet.ServletException;
インポート javax.servlet.ServletRequest;
インポート javax.servlet.ServletResponse;
インポート javax.servlet.UnavailableException;
インポート javax.servlet.http.HttpServletRequest;
インポート javax.servlet.http.HttpServletResponse;
パブリック クラス SetCharacterEncodingFilter
フィルターを実装します {
protected 文字列エンコーディング = null;
protected FilterConfig filterConfig = null;
public
void destroy()
;
this.filterConfig = null;
}
public void doFilter(ServletRequest リクエスト、ServletResponse レスポンス、
FilterChain チェーン) throws IOException, ServletException {
// 使用する文字エンコーディングを条件付きで選択して設定します
if (ignore || (request.getCharacterEncoding() == null)) {
文字列エンコーディング = selectEncoding(request);
if (エンコーディング != null) {
request.setCharacterEncoding(encoding); // これが機能します。このリクエストの本文で使用される文字エンコーディングの名前をオーバーライドします。このメソッドは、リクエスト パラメーターを読み取る前、または getReader( を使用して入力を読み取る前に呼び出す必要があります)。 )。
}
}
// 次のフィルタに制御を渡します
chain.doFilter(リクエスト, レスポンス);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("エンコーディング");
文字列値 = filterConfig.getInitParameter("ignore");
if (値 == null) {
this.ignore = true;
}
else if (value.equalsIgnoreCase("true")) {
this.ignore = true;
}
else if (value.equalsIgnoreCase("yes")) {
this.ignore = true;
}
それ以外 {
this.ignore = false;
この
よう
にして、リクエストは UTT-8 でエンコードされ、JSP プログラムで使用できます。 request.getParameter(
"
myKey
"
)
) new String(request.getParameter("myKey").getBytes("ISO-8859-1"), "GBK") のようにする代わりに、UTF-8 でエンコードされた文字列を直接取得して、文字化けを解決できます。 http://www.devdao.com/
(2) データベースによって処理される 2 バイト テキストhttp://www.upas.org/java/DatabaseEncodingProblemSolution/
もう 1 つは、データベースへの書き込みの問題です。mysql を使用する場合、次の URL を使用して中国語の文字エンコーディングの問題に対処できることがわかっています: jdbc:mysql://localhost:3306/upas?useUnicode=true&characterEncoding=gb2312,
では、mysql のように解決できないものについてはどうすればよいでしょうか?毎回次のように書けばいいのでしょうか?
import java.sql.*;
Class.forName("org.gjt.mm.mysql.Driver");
接続 con = null;
PreparedStatement pstmt = null;
結果セット rs = null;
試す {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
pstmt = con.prepareStatement("SELECT f3, f4 FROM tbl1 WHERE f1 = ? AND f2 = ?");
pstmt.setString(1, new String(f1.getBytes("GBK"), "ISO-8859-1");
pstmt.setString(2, new String(f2.getBytes("GBK"), "ISO-8859-1");
rs = pstmt.executeQuery();
文字列 f3、f4;
while(rs.next()) {
f3 = 新しい String(rs.getString(1).getBytes("ISO-8859-1"), "GBK");
f4 = 新しい String(rs.getString(2).getBytes("ISO-8859-1"), "GBK");
}
}
ついに {
// リソースを閉じる
...
実際
、次のように書くことができます。
インポート java.sql.*;
import com.redv.sql.encoding.*;
Class.forName("org.gjt.mm.mysql.Driver");
接続 con = null;
PreparedStatement pstmt = null;
結果セット rs = null;
試す {
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "");
//データベース接続インスタンスを引き継ぐ
ブールコーディング = true;
EncodingConnectioncodingConnection = new EncodingConnection(con,coding, "ISO-8859-1", "GBK");
//引き継ぎ後にデータベース接続インスタンスを取得します。これは、既に EncodingConnection によって再パッケージ化されたインスタンスです。
con =codingConnection.getConnection();
pstmt = con.prepareStatement("SELECT f3, f4 FROM tbl1 WHERE f1 = ? AND f2 = ?");
pstmt.setString(1, f1);
pstmt.setString(2, f2);
rs = pstmt.executeQuery();
文字列 f3、f4;
while(rs.next()) {
f3 = rs.getString(1);
f4 = rs.getString(2);
}
}
ついに {
// リソースを閉じる
...
データベース接続を取得する場所を少し変更するだけで、プロパティのパラメータとして保存し、コーディングのブール値を変更して自動エンコード変換を使用するかどうかを設定することもできます
。
多くの場合、Database クラスを使用してデータベース接続を取得する getConnection をカプセル化できるため、javax.sql.DataSource からデータベース接続を取得できます。現時点では、エンコード変換コードを追加するために rs.setString() と rs.getString() が使用されるすべての場所を検索するのではなく、Database クラスを変更するだけで済みます。 con.createStatment() ステートメントを使用する場合、SQL ステートメントに中国語やその他の 2 バイト文字が含まれていても問題はありません。
学生テーブル WHERE クラス LIKE '%computer%' から名前、性別を選択します