2

フォームから入力した国際文字が入力したとおりに保存されず、保存されたデータがデータベースに保存されたとおりに返されません。

「çanak çömlek patladı」と入力してフォームの保存をクリックすると、ページに「çanak çömlek patladı」と表示されますが、データベースには「çanak çömlek patlad?」が保存されていますか? もう一度ページにアクセスすると、「￧anak ￧�mlek patlad?」と表示されます。何も変更せずにフォームの保存をクリックすると、データベースには「?anak ??mlek patlad?」と保存されます。ブラウザに「?anak ??mlek patlad?」と表示されます。

次の構成のMySQLサーバーがあります。

default-collation=utf8
collation_server=utf8_unicode_ci
character_set_server=utf8
default-character-set=utf8

データベースの文字セットは utf8 で、データベースの照合順序は utf8_unicode_ci で、使用しているテーブルも同じように設定されています。

JSP ファイルの最初の行は次のとおりです。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

HTMLヘッダーは次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>

私はコンパイルされた EncodingFilter クラスを持っています:

import java.io.IOException;
import javax.servlet.*;

public class EncodingFilter
    implements Filter
{

    public EncodingFilter()
    {
    }

    public void init(FilterConfig filterconfig)
        throws ServletException
    {
        filterConfig = filterconfig;
        encoding = filterConfig.getInitParameter("encoding");
    }

    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
        throws IOException, ServletException
    {
        servletrequest.setCharacterEncoding(encoding);
        filterchain.doFilter(servletrequest, servletresponse);
    }

    public void destroy()
    {
    }

    private String encoding;
    private FilterConfig filterConfig;
}

このクラスは、web.xml ファイルで次のように参照されます。

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

システムを再起動したため、Tomcat と MySQL サーバーを再起動し、ログを確認しましたが、上記の構成のいずれにもエラーはありません。

誰か助けてくれませんか?

4

6 に答える 6

2

それを解決し、以前に開発されたクラスが二重エンコーディングの問題を引き起こしているように見えたので、以前の db Java クラスを捨てて、新しい db 関数を書きました。

'çanak çömlek patladı' を手動でデータベースに直接入力すると、MySQL が実際には varchar フィールドで UTF-8 を処理しないという問題に関連するエラーが発生しました。フィールドを varbinary に更新するとすぐに、すべてが機能しました。

これが誰かの役に立てば幸いです。私の髪は元に戻ると確信しています。提案を提供してくれたすべての人に感謝します。

于 2012-07-17T14:20:12.477 に答える
0

データベースに接続するときに、「characterEncoding」を「utf8」に設定していることを確認できますか? また、ブラウザ (ffox など) でページを開いた場合、表示されている文字エンコードは何ですか?

「divide et impera」を少し試してみるといいと思います。MYSQL が問題であるかどうかを知ることが重要です (私はそうではないと思います)。これを行うには、アプリケーションに UTF 文字列を挿入してデータベースに保存します。これが機能しない場合、問題は mysql であることがわかります。動作する場合は、おそらくサーブレットです。

これをサーブレット レベルで追加しても問題ありません。

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
于 2012-07-13T10:32:01.993 に答える
0

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8 から始めます

MySQL の文字保持列は、UTF-8 文字を受け入れることができる必要があります。latin1DDL スクリプトが列の文字セットを設定しない限り、ほとんどの MySQL デフォルトは文字セット用です。

テーブルをあるエンコーディングから別のエンコーディングに変更したい場合は、次のように行うことができます:

mysql> ALTER TABLE t CONCERT TO CHARACTER SET 'utf8'

本当にやりたい場合は、列ごとにこれを行うこともできると思います。大量のデータや多数のインデックスなどを含むテーブルでは、ALTER に非常に長い時間がかかる場合があることに注意してください。

于 2012-07-16T01:20:59.990 に答える
0

データベースから何かを取得する前に、クエリを実行してからSET NAMES UTF8すべてのクエリを実行します。その後、見た目どおりの文字を取得します。

于 2012-07-13T10:29:43.890 に答える
0

文字エンコーディングに問題があります (JSP-Mysql)。 String URL = "jdbc:mysql://localhost/deneme?useUnicode=true&characterEncoding= ISO-8859-1 ";と書きました。そして問題を解決しました。ただし、データベースのテーブルはUTF-8 でなければなりません。

于 2013-03-06T22:43:46.503 に答える
0

次のことを確認する必要があります。

  1. データベースは多言語をサポートしている必要があります (MySQL の場合、インストール時にこのオプションを要求されます)。
于 2012-07-13T10:38:53.073 に答える