2011-12-13 12 views
1

日本語の文字列AKB48 ネ申テレビ シーズン3を含むPOSTデータがjQueryでdataと定義されています。Java POSTデータからmySQL UTF-8エンコーディングへの問題

String data = new String(this.request.getParameter("data").getBytes("ISO-8859-1"), "UTF-8"); 

私のプログラムは、MySQLに保存しますが、データはデータベースに保存された後に、それは次のようになります:

$("#some_div").load("someurl", { data : "AKB48 ネ申テレビ シーズン3"}) 

ポストデータは、Javaサーブレットに送信され

AKB48 u30CDu7533u30C6u30ECu30D3をu30B7u30FCu30BAu30F33

したい場合はどうすればよいですかそれをUTF-8のように保存しますか?私のすべてのファイルはUTF-8です。

MySQLのエンコーディングはUTF8であり、ここであなただけのthis.request.getParameter("data")のようなパラメータの値を抽出していないのはなぜコード

String sql = "INSERT INTO Inventory (uid, item_id, item_data, ctime) VALUES (" 
       + inventory.getUid() + ",'" 
       + inventory.getItemId() + "','" 
       + StringEscapeUtils.escapeJava(inventory.getItemData()) + "',CURRENT_TIMESTAMP)"; 
    Statement stmt = con.createStatement(); 
    int cnt = stmt.executeUpdate(sql); 
+0

はutf8のmysqlデータベースですか?どのようにあなたはmysql、ストレートSQLまたは休止状態などに固執していますか?また、コードポイントを正しく保存しているため、間違って表示されている可能性があります。 –

+0

はい、mySQLはすべてutf8です。 – bbnn

答えて

3

上記の例から、日本語の文字列がMySQLデータベースに正しく保存されていることを確認できますが、escaped Unicodeとなります。

私がためにこれらの項目をチェックします:

  1. は、あなたのテーブルおよび列はすべてのutf8の文字セットと照合に設定されていますか?たとえば、 CHARACTER SET utf8 COLLATE utf8_general_ci
  2. POSTの前に文字セットのエンコードを明示的に設定していますか? request.setCharacterEncoding("UTF-8");
  3. db接続の文字エンコードを設定していますか?他の人が指摘したように、すなわち、jdbc:mysql://localhost:3306/YOURDB?useUnicode=true&characterEncoding=UTF8

は、あなたはそのgetBytesトリックを使うべきではありません。 POSTされた値は必ず間違っています。それはエスケープUnicode文字にあなたの文字列に変わりますので、

EDIT

は、StringEscapeUtils.escapeJavaを使用しないでください。それはAKB48 ネ申テレビ シーズン3AKB48 u30CDu7533u30C6u30ECu30D3 u30B7u30FCu30BAu30F33に変換するものです。

+0

Iやったステップ1と2が、私は\t \t \tのDataSource DC =(データソース)ctx.lookup( "で、java:comp/env/JDBC /データベース名")を使用していない3からです。 接続の種類 – bbnn

+0

@ bn。私のポイント3は、データベース接続の文字セットエンコーディングを明示的に設定することです。これを行わないと、誤ったエンコーディングでデータベースにデータを保存する可能性があります。 '(DataSource)ctx.lookup'はデータソースの場所を特定するためのものですが、これはまったく別の問題です。データベース接続の作成方法を再検討することを強くお勧めします。 – buruzaemon

+0

データソース設定の接続プロパティとして設定する必要があります。ああ、すべての '新しい文字列(文字列、文字セット)'と 'string.getBytes(文字セット)'ナンセンスを取り除いてください。 – BalusC

0

のですか?

データは、各ユニコード文字がそのコードに置き換えられるURLエンコードを使用して正しく送信されます。次に、パラメータの値を取得する必要があります。 ISO-8859-1を使用してバイトを要求すると、文字列はテキスト形式のコードの場合はシーケンスとして表されるため、実際にはデータが破損しています。

+0

データが破損する可能性がありますが、その文字は字幕の範囲外です。これはこの例では問題ではありません。彼は正しいコードポイントを自分のMYSQLに保存しているので、正しく解釈されているのがわかります。しかし、私はあなたのtomcat設定で 'URIEncoding =" UTF-8 "'を使用して、パラメータエンコーディングを処理させるだけのアレックスです。 –

+0

私はjqueryの読み込みがポストを使用していることに気づいていませんでした。 'URIEncoding =" UTF-8 "'は必要ありません。 –

0

ラインのポイントは、あなたがISO-8859-1エンコーディングを使ってバイトに中国語(または少なくとも非西洋)の文字を変換している

String data = new String(this.request.getParameter("data").getBytes("ISO-8859-1"), "UTF-8"); 

何ですか。もちろん、ISO-8859-1エンコーディングでは中国語文字がサポートされていないため、これはうまくいかない。 ANDでは、UTF-8エンコーディングを使用してISO-8859-1でエンコードされた文字を表すはずのバイトから新しいStringを作成しています。これはもう一度意味をなさない。 UTF-8とISO-8859-1は同じものではなく、わずかな文字セットだけが両方の形式で同じエンコーディングを持ちます。

だけ

String data = this.request.getParameter("data"); 

を使用し、すべてがOKである必要があり、MySQLのテーブルの列がこれらの文字をサポートしているエンコーディングを使用することを条件とします。

EDIT:あなたは私たちに、データベースにデータを挿入するために使用されるコードを示してきたことを今

、すべてこれはどこから来るのか、私は知っている(前のポイントはいえ、まだ有効です)。あなたは何をしているのですか

StringEscapeUtils.escapeJava(inventory.getItemData()) 

何がポイントですか? escapeJavaは、有効なJava文字列リテラルにするために、文字列を受け取り、特殊文字をエスケープするために使用されます。それはSQLとは関係ありません。準備されたステートメントを使用してください:

String sql = "INSERT INTO Inventory (uid, item_id, item_data, ctime) VALUES (?, ?, ?, CURRENT_TIMESTAMP); 
PreparedStatement stmt = con.prepareStatement(); 
stmt.setInteger(1, inventory.getUid()); // or setLong, depending on the type 
stmt.setString(2, inventory.getItemId()); 
stmt.setString(inventory.getItemData()); 
int cnt = stmt.executeUpdate(); 

PreparedStatementは特殊なSQL文字を正しくエスケープします。これらはSQLインジェクション攻撃の最善のツールであり、特にクエリがエンドユーザーからのものである場合は、クエリがパラメータを持つときに使用する必要があります。 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.htmlを参照してください。

+0

私は文字列data = this.request.getParameter( "data")のみを使用します。 AKB48 u00E3u0083u008Du00E7u0094u00B3u00E3u0083u0086u00E3u0083u00ACu00E3u0083u0093 u00E3u0082u00B7u00E3u0083u00BCu00E3u0082u00BAu00E3u0083u00B33 – bbnn

+0

私たちのMySQLの列のエンコーディングを教え、そして私たちに、データベース内の文字列を保存するために使用されるコードを示しています。 それは別の何かのようになります。 –

+0

そのutf8 – bbnn

0

Java文字列は、UTF-16で格納されます。したがって、このコード:

String data = new String(this.request.getParameter("data").getBytes("ISO-8859-1"), "UTF-8"); 

は、ISO-8859-1文字セットを使用してバイナリ配列に(HTTPプロトコルでUTF-8から再符号化された)UTF-16文字列をデコードし、再UTF-8文字セットを使用してバイナリ配列をエンコードします。これはほとんどあなたが望むものではありません。

これを使用するとどうなりますか?

String data = this.request.getParameter("data"); 
System.out.println(data); 

2行目で不良データが生成された場合、問題はjQueryで発生する可能性があります。それは悪いデータを生成しない場合は

System.out.println(this.request.getHeader("Content-Encoding")); 

が、データは、MySQLに正しく保存されません、あなたの問題は、データベースレベルである:あなたは確かにあなたのjQueryのリクエストでユニコードを取得していることを決定します。列タイプがユニコード文字列をサポートしていることを確認してください。

+0

System.out.println(this.request。getHeader( "Content-Encoding")); 返す私はnull – bbnn

関連する問題