我正在使用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
语句和以前收到的错误消息会很有帮助。