Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jsoup的奇怪编码行为_Java_Html_Character Encoding_Html Parsing_Jsoup - Fatal编程技术网

Java jsoup的奇怪编码行为

Java jsoup的奇怪编码行为,java,html,character-encoding,html-parsing,jsoup,Java,Html,Character Encoding,Html Parsing,Jsoup,我使用jsoup从不同页面的html源代码中提取了一些信息。大多数是UTF-8编码的。其中一个是用ISO-8859-1编码的,这导致了一个奇怪的错误(在我的optinion中) 包含错误的页面是: 我使用以下代码读取所需字符串: Document doc = Jsoup.connect("http://www.gudi.ch/armbanduhr-metall-wasserdicht-1280x960-megapixels-p-560.html").userAgent("Mozilla").g

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

包含错误的页面是:

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

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–500万像素”中的连字符。像öäü这样的正常元音被正确读取。只有这个不输出为“-;”的字符才是问题所在

我试图用out.outputSettings().charset(“ISO-8859-1”)覆盖(正确设置)页面编码,但也没有帮助

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

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


谢谢

这是网站本身的错误。实际上有三个错误:

  • 该页面在HTTP
    内容类型
    响应头中不包含任何字符集。HTML元标记中有
    ISO-8859-1
    ,但当通过HTTP提供页面时,会忽略这一点!一般的网络浏览者要么尝试智能检测,要么使用平台默认编码对网页进行编码,在Windows机器上是CP1252

  • 标记假装内容是ISO-8859-1编码的,但实际字符
    -
    ()根本不是该字符集的。但是,CP1252字符集将其设置为
    0x0096

  • 根据网页源代码,产品名称使用文字字符
    ,而不是HTML实体
    &ndash如同一网页上其他地方所示

  • 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();
    // ...
    

    嗯,这是一个—(E28093),在UTF-8下应该是一个有效字符(我认为)。是否有可能,一旦它被读取为8859-1,就无法将其转换回?你能把它作为UTF-8强制读入吗?是的,我可以用out.outputSettings().charset(“UTF-8”)强制读入,但这并没有真正的帮助。当我想显示字符代码时,结果是charcode 150,它应该是有效的,如本页所示:。有了这个,我意识到,字符不是连字符或破折号,应该是45。字符码150位于扩展ascii字符集内。看起来浏览器倾向于将
    0x96
    显示为破折号,即使
    内容类型
    标题中指定了ISO-8859-1。@axtavt:内容类型标题中没有字符集。将使用平台默认字符集,即Windows中的CP1252。另请参见第1点。感谢您对此问题的明确解释!通过手动编码(我昨天用ISO-8859-1的相同方法尝试了这种编码),内容被正确编码。我会就这个问题联系网站运营商,希望他能通过将页面设置为utf-8或将内容类型标题设置为ISO-8859-1来纠正这个问题。不仅如此,还必须修复违规字符。根据问题的来源,应该通过使用UTF-8在DB中存储数据或使用
    htmlentities()
    在HTML中重新显示标题来修复问题。这是一个CP1252特殊字符。单独将内容类型字符集更改为ISO-8859-1或UTF-8将失败,因为该字符根本不会显示为ISO-8859-1或UTF-8(这正是您自己遇到的问题)。用户代理呢?在这种情况下如何设置?