【问题标题】:Strange encoding behaviour with jsoupjsoup 的奇怪编码行为
【发布时间】:2011-12-04 14:51:31
【问题描述】:

我用jsoup从不同页面的html源代码中提取了一些信息。它们中的大多数是 UTF-8 编码的。其中一个是用 ISO-8859-1 编码的,这会导致一个奇怪的错误(在我的选择中)。

包含错误的页面是: http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html

我使用以下代码读取了所需的字符串:

Document doc = Jsoup.connect("http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html").userAgent("Mozilla").get();
String title = doc.getElementsByClass("products_name").first().text();

问题是字符串“HD Armbanduhr aus Metall 4GB Wasserdicht 1280X960 – 5 Megapixels”中的连字符。像öäü 这样的正常变音符号可以正确读取。仅此单个字符,不输出为“-”出了问题。

我尝试使用 out.outputSettings().charset("ISO-8859-1") 覆盖(正确设置的)页面编码,但这也无济于事。

接下来,我尝试使用 Charset 类手动将字符串的编码从 utf8 和 iso-8859-1 更改为 utf8 和 iso-8859-1。也没有运气。

有人提示我在使用 jsoup 解析 html 文档后可以尝试获取正确的字符吗?

谢谢

【问题讨论】:

  • 嗯,这是一个— (e2 80 93),在 UTF-8 下应该是一个有效字符(我认为)。是否有可能一旦读入 8859-1 就无法将其转换回来?您可以将其强制读取为 UTF-8 吗?
  • 是的,我可以用 out.outputSettings().charset("UTF-8") 强制它,但这并没有真正的帮助。当我想显示字符代码时,结果是 charcode 150,它应该是有效的,如本页所示:web-source.net/symbols.htm。有了这个,我意识到 char 不是连字符或破折号,它是 45。charcode 150 在扩展的 ascii 字符集中。

标签: java html character-encoding html-parsing jsoup


【解决方案1】:

这是网站本身的错误。其实是三个错误:

  1. 在 HTTP Content-Type 响应标头中没有任何字符集提供页面。 HTML 元标记中有ISO-8859-1,但是当页面通过 HTTP 提供时,它会被忽略!一般的浏览器要么尝试智能检测,要么使用平台默认编码对网页进行编码,在 Windows 机器上为 CP1252。

  2. <meta> 标记假装内容是 ISO-8859-1 编码的,但该字符集的实际字符 – (U+2013 EN DASH) 不是 covered一点也不。然而,它是covered,CP1252 字符集为0x0096。

  3. 根据网页源代码,产品名称使用文字字符 –,而不是同一网页上其他地方发现的 HTML 实体 –。

Jsoup 可以透明地修复许多开发不佳的网页,但是这个真的超越了 Jsoup。您需要手动读取它,然后将其作为 CP1252 提供给 Jsoup。

String url = "http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html";
InputStream input = new URL(url).openStream();
Document doc = Jsoup.parse(input, "CP1252", url);
String title = doc.select(".products_name").first().text();
// ...

【讨论】:

  • 看起来浏览器倾向于将0x96显示为破折号,即使在Content-Type标头中指定了ISO-8859-1。
  • @axtavt:内容类型标头中没有字符集。将使用平台默认字符集,在 Windows 中为 CP1252。另见第 1 点。
  • 感谢您对这个问题的清晰解释!使用手动编码(我昨天用 ISO-8859-1 尝试了同样的方法),内容被正确编码。我会就这个问题联系网站运营商,希望他可以通过将页面设置为 utf-8 或将 Content-Type Header 设置为 ISO-8859-1 来解决此问题。
  • 不仅如此,还必须修复违规字符。根据问题的根源,应该通过使用 UTF-8 将数据存储在 DB 中或使用 htmlentities() 在 HTML 中重新显示标题来修复它。这是 CP1252 特有的字符。仅将内容类型字符集更改为 ISO-8859-1 或 UTF-8 将失败,因为该字符根本不会显示(这正是您自己遇到的问题)。
  • 用户代理呢?这种情况下怎么设置?
猜你喜欢
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2015-07-08
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多