为什么问号会用整理utf-8替换mysql数据库中的某些字符?

时间:2017-12-20 19:36:59

标签: java mysql database utf-8

我正在使用Jsoup来抓取网页。它接收文本并将其直接输入数据库。

目标网页上的文字看起来非常好,但在输入数据库后,我会得到替换某些字符的问号。

例如,以下句子中的单右引号(U + 2019):

  

我无法想象呃,一个没有受到影响的人类努力领域   想象力。

将在数据库和我正在输出的网页上显示如下:

  

我无法想象呃,这个人类努力的领域并没有受到影响   想象力。

最初我认为这只是数据库的字符集/整理问题,但在尝试了不同的类型之后,问题仍然存在......

我目前正在使用的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

我尝试过创建一个新的数据库,似乎没什么用。

为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:1)

Jsoup会自动检测正在抓取的网页的字符集。 但是,许多网站没有通过不定义字符集来设置字符集编码和内容类型标头。

如果您抓取此类网页(HTTP响应Content-Type标头中缺少charset属性),Jsoup将使用平台的默认字符集解析该页面。这也意味着您可能无法获得预期的结果,因为平台的默认字符集可能与您正在抓取的网页不同。 这可能会导致字符丢失或被错误地解析/打印。

要避免此类行为,您需要将URL读取为InputStream并手动指定所需的字符集 在Jsoup的解析方法中,如下所示:

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

答案 1 :(得分:0)

使页面正常工作有几个步骤。

参见&#34;问号&#34;在filters