4

RSS チャネルからデータを取得し、サニタイズしてデータベースに保存しています。Java、tidy、MySQL、および JDBC を使用しています。

手順:

  1. RSS レコードを取得します。大丈夫です。
  2. html を tidy でサニタイズします。ここに 1 つの変換があります。Tidy は、「そうはありません」のような文字列を「そうはありません」に自動的に変換します。
  3. この文字列をテーブルに保存します

MySQLスキームは

CREATE TABLE IF NOT EXISTS `rss_item_safe_texts` (
  `id` int(10) unsigned NOT NULL,
  `title` varchar(1000) NOT NULL,
  `link` varchar(255) NOT NULL,
  `description` mediumtext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

JDBC接続URLは

connUrl = "jdbc:mysql://" + host + "/" + database + "?user=" + username + "&password=" + password + "&useUnicode=true&characterEncoding=UTF-8";

Javaコードは

PreparedStatement updateSafeTextSt = conn.prepareStatement("UPDATE `rss_item_safe_texts` SET `title` = ?, `link` = ?, `description` = ? WHERE `id` = ?");
updateSafeTextSt.setString(1, EscapingUtils.escapeXssInjection(title));
updateSafeTextSt.setString(2, link);
updateSafeTextSt.setString(3, EscapingUtils.escapeXssInjection(description));
updateSafeTextSt.setInt(4, itemId);
updateSafeTextSt.execute();
updateSafeTextSt.close();

その結果、データベースに「それで?ありそうもない」のような壊れた文字が表示されます。同じように、Web ページ (utf-8 ページ) にテキストを出力します。

4

1 に答える 1

5

エンコーディングを別の方法で設定できる場所が他にもたくさんあることを忘れないでください。たとえば、データベース/テーブル/列に正しいエンコーディングがあるかどうかを確認してください。また、私は通常、MySQL でできる限りすべてを utf8 に設定します。

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
于 2010-05-14T11:06:11.677 に答える