我有
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和字节码的网站
答案 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和字节码的网站
请刷新词汇“字节码”的含义。这与字符编码完全无关。