java.nio.charset.UnsupportedCharsetException:Jsoup中的X-MAC-ROMAN获取网页

时间:2012-09-04 13:53:02

标签: java character-encoding jsoup

我有

Document document = Jsoup.connect(link).get();

有些时候我会得到一个例外:

Exception in thread "main" java.nio.charset.UnsupportedCharsetException: X-MAC-ROMAN
    at java.nio.charset.Charset.forName(Unknown Source)
    at org.jsoup.helper.DataUtil.parseByteData(DataUtil.java:86)
    at org.jsoup.helper.HttpConnection$Response.parse(HttpConnection.java:469)
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:147)

我有一个catch块:

catch (IOException  e1)

我理解异常是因为java是unicode而且网页/网站没有关注unicode。如何处理这个问题,连接也用于许多包含unicode和字节码的网站

1 个答案:

答案 0 :(得分:4)

  

我理解异常是因为java是unicode而且网页/网站没有关注unicode。

这不完全正确。您可能会混淆“Java is unicode”这一说法,因为Java使用Unicode在内存中存储字符串/字符(您知道,计算机内存只能存储字节(0和1),而不是字符,因此字符需要使用特定的字符编码转换为字节并返回; Java正在使用unicode)。

发生此异常是因为运行Java代码的底层操作系统平台不支持此charset,因此Java无法将Web服务器获取的字节转换为此编码中的字符。此charset特定于Mac OS平台,您可能正在运行Windows等。


  

如何处理此问题

与网站管理员联系并将其报告为错误。 他们的错误他们使用特定于平台的(Mac OS)编码而不是通用(ISO / UTF)编码。

至于Jsoup,您最好的选择是首先将InputStream设为URL#openStream(),然后将其提供给Jsoup#parse(),而不是明确指定您支持的字符编码平台,如ISO-8859-1。 E.g:

Document doc = Jsoup.parse(new URL(link).openStream(), "ISO-8859-1", link);

请注意,如果存在非ASCII字符,您仍有可能以Mojibake结束。另请注意,不应对所有链接执行此操作,而应仅针对那些抛出UnsupportedCharsetException的人(因此,在catch块中执行作业)。


  

但是我可以在我的Chrome中访问它,为什么不能从Jsoup

这是因为Chrome试图对你这么好,它忽略了未知编码并选择了默认编码 - 这可能仍然存在于Mojibake中显示的网站风险;超出ASCII范围的任何内容都可能看起来格格不入。


  

connect用于许多包含unicode和字节码的网站

请刷新词汇“字节码”的含义。这与字符编码完全无关。