我正在使用Java将网页抓取到MySQL数据库。
这些网页采用各种编码方式(例如GBK,UTF8 ...),可能不包含任何ASCII字符,但是,我设法检测每个网页的编码并获取可读字符串(可读字符串表示它在{{{ 1}},如Eclipse console
)。
我从Web Browser
标记获得网页编码,如果找不到则默认为UTF-8
。
请参阅以下代码段:
<meta>
然后,我将它存储到MySQL。 MySQL连接URL为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);
,存储文本的列为jdbc:mysql://localhost:3306/db?characterEncoding=gbk
编码。
事情发生了GBK
中显示的字符串在MySQL中被证明是无法识别的序列,有时可能引发SQLException。在观察上,没有Eclipse console
字符串会出错。
我认为将GBK
字符串转换为Non-GBK
会有效,但如何?
是否有任何解决方法?我的最终目标是构建倒排索引。
首选编码转换的答案。
任何帮助都将不胜感激。提前谢谢。
<小时/> 添加
创建表SQL:
GBK
错误讯息:
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;
答案 0 :(得分:0)
Java将在内部正确表示字符串,由Eclipse控制台显示。您应该能够使用UTF8连接到数据库并将数据存储在UTF8编码列中。如果您希望列为GBK,我仍然会使用UTF8进行连接。如果这不起作用,如果您可以发布CREATE TABLE
语句和之前收到的错误消息,将会很有帮助。