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

问题描述 投票:1回答:2

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

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

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

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

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

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

最初我认为这只是数据库的charset / collat​​ion的一个问题,但在尝试了不同的类型之后,问题仍然存在......

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

我试过创建一个新的数据库,似乎没有任何工作..

任何想法为什么会这样?

java mysql database utf-8
2个回答
1
投票

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

0
投票

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

请参阅Trouble with UTF-8 characters; what I see is not what I stored中的“问号”

© www.soinside.com 2019 - 2024. All rights reserved.