我正在使用Jsoup来抓取网页。它接收文本并将其直接输入数据库。
目标网页上的文字看起来非常好,但在输入数据库后,我会得到替换某些字符的问号。
例如,以下句子中的单右引号(U + 2019):
我无法想象呃,一个不受想象影响的人类努力领域。
将在数据库和我正在输出的网页上显示如下:
我无法想象呃,这个人类努力的领域并没有受到想象力的影响。
最初我认为这只是数据库的charset / collation的一个问题,但在尝试了不同的类型之后,问题仍然存在......
我目前正在使用的sql数据库是在utf-8中:
mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+--------+
元设置:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
我试过在java中专门设置它,如下所示:
url = "jdbc:mysql://localhost:3306/somedb?useUnicode=true&characterEncoding=utf-8";
我试过sql查询,如:
SET NAMES 'utf8'
SET CHARACTER SET utf8
我试过创建一个新的数据库,似乎没有任何工作..
任何想法为什么会这样?
Jsoup会自动检测正在抓取的网页的字符集。但是,许多网站没有通过不定义字符集来设置字符集编码和内容类型标头。
如果您抓取此类网页(HTTP响应Content-Type标头中缺少charset属性),Jsoup将使用平台的默认字符集解析该页面。这也意味着您可能无法获得预期的结果,因为平台的默认字符集可能与您正在抓取的网页不同。这可能会导致字符丢失或者解析/打印错误。
要避免这种行为,您需要将URL作为InputStream读取,并在Jsoup的parse方法中手动指定所需的字符集,如下所示:
String page = "http://www.somepage.com";
//get input stream from the URL
InputStream in = new URL(page).openStream();
//parse document using input stream and specify the charset
Document doc = Jsoup.parse(in, "ISO-8859-1", page);
//..do your processing
有几个步骤可以使页面正常工作。
请参阅Trouble with UTF-8 characters; what I see is not what I stored中的“问号”