如何解决Java商店以统一编码将页面爬网到mysql
| 我正在使用Java将网页爬网到MySQL数据库。 这些网页采用各种编码(例如,GBK,UTF8 ...),并且可能不包含ASCII字符,但是,我设法检测到每个页面的编码并获得可读的字符串(可读字符串表示它在Eclipse console
中显示为与在Web Browser
中)。
我从<meta>
标签获取网页编码,如果未找到,则默认为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
编码。
发生的事情是,在ѭ0中正确显示的字符串在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
语句和之前收到的错误消息,这将对您有所帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。