我正在使用Java将网页爬网到MySQL数据库。

这些网页采用各种编码(例如,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。 MySQL连接URL为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

最佳答案

Java将在内部正确地表示由Eclipse控制台显示的字符串。您应该能够使用UTF8连接到数据库并将数据存储在UTF8编码的列中。如果您希望列为GBK,我仍将使用UTF8进行连接。如果这不起作用,则可以发布您的CREATE TABLE语句和以前收到的错误消息会很有帮助。

07-23 20:35