Я сканирую веб-страницы в базе данных MySQL, используя Java.
Эти веб-страницы имеют различную кодировку (например, GBK, UTF8 ...) и могут не содержать символов ASCII, однако мне удалось определить кодировку каждой страницы.и получить читаемую строку (читаемая строка означает, что она отображает то же самое в Eclipse console
, что и в Web Browser
).
Я получаю кодировку веб-страницы, по умолчанию UTF-8
, если не найден, из тега <meta>
.Смотрите следующий фрагмент:
InputStream is = hconn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = -1;
while (-1 != (b = is.read())) {
baos.write((byte) b);
}
String charset = "UTF-8";
Document doc = Jsoup.parse(baos.toString());
Elements metas = doc.select("meta[http-equiv=Content-Type]");
Pattern p = Pattern.compile("charset=([0-9a-zA-Z_\\-]+)");
Matcher m;
for (Element meta : metas) {
m = p.matcher(meta.toString());
if (m.find())
charset = m.group(1);
}
String str = new String(baos.toByteArray(), charset);
Затем я сохраняю его в MySQL.URL-адрес соединения MySQL - jdbc:mysql://localhost:3306/db?characterEncoding=gbk
, а столбец для хранения текста имеет кодировку GBK
.
Случилось так, что строки, хорошо отображаемые в Eclipse console
, оказались не распознаваемой последовательностью в MySQL и иногда могут вызывать SQLException.Наблюдение: ни одна строка GBK
не будет работать неправильно.
Я думаю, преобразование строк Non-GBK
в GBK
будет работать, но как?И есть ли обходные подходы?Моя конечная цель - построить инвертированный индекс.
Ответы на преобразование кодировки предпочтительнее.
Любая помощь будет благодарна.Заранее спасибо.
Добавить: Создать таблицу SQL:
CREATE TABLE `indexer`.`pages` (
`content` TEXT CHARACTER SET gbk COLLATE gbk_chinese_ci,
`url` VARCHAR(512) NOT NULL,
`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
Сообщение об ошибке:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'é”??μ¢Wé”??μ?é”??μ—é”??–¤??·DPIyé”????é”??–¤??·é”????0")Sé”????<é”????cé”??–¤??' at line 1