Java store以统一编码将页面爬网到mysql
我正在使用Java将网页爬行到MySQL数据库 这些网页采用各种编码(例如GBK、UTF8…),可能不包含ASCII字符,但是,我设法检测到每个网页的编码并获得可读字符串(可读字符串意味着它在Eclipse控制台中的显示与在Web浏览器中的显示相同) 我从Java store以统一编码将页面爬网到mysql,java,mysql,encoding,web-crawler,Java,Mysql,Encoding,Web Crawler,我正在使用Java将网页爬行到MySQL数据库 这些网页采用各种编码(例如GBK、UTF8…),可能不包含ASCII字符,但是,我设法检测到每个网页的编码并获得可读字符串(可读字符串意味着它在Eclipse控制台中的显示与在Web浏览器中的显示相同) 我从标签获取网页编码,如果未找到,则默认为UTF-8。 请参见以下代码段: InputStream is = hconn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOut
标签获取网页编码,如果未找到,则默认为UTF-8
。
请参见以下代码段:
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控制台中良好显示的字符串在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;
错误消息:
您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解使用“é”?μ附近的正确语法¢Wé?μ?é?μ-é?DPIyé?0“)Sé”?Java将在内部正确表示Eclipse控制台显示的字符串。您应该能够使用UTF8连接到数据库,并将数据存储在UTF8编码的列中。如果希望列为GBK,我仍然会使用UTF8进行连接。如果这不起作用,如果您可以发布createtable
语句和之前收到的错误消息,这将非常有用 使用UTF8连接只会帮助那些使用UTF8编码的页面,而不支持其他编码。我发布了createtable
SQL和错误消息。无论如何谢谢。@user435657,这似乎很奇怪。您是否尝试过将列和编码都设置为UTF8?