java.nio.charset.UnsupportedCharsetException : X-MAC-ROMAN in Jsoup getting a webpage

标签 java character-encoding jsoup

我有

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

有时对于某些网址我会得到一个异常(exception):

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 block :

catch (IOException  e1)

我知道异常是因为 java 是 unicode 而该网页/站点不遵循 unicode。如何处理这个问题连接也用于许多网站,其中包括 unicode 和字节码

最佳答案

I understand the exception is because java is unicode and that webpage/site is not following unicode.

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

出现此异常是因为运行 Java 代码的底层操作系统平台不支持此字符集,因此 Java 无法将从网络服务器获取的字节转换为此编码中的字符。此字符集特定于 Mac OS 平台,您可能运行的是 Windows 左右。


how to handle this issue

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

至于 Jsoup,最好的办法是首先通过 URL#openStream() 将网站作为 InputStream,然后将其提供给 Jsoup#parse() 而不是在其中明确指定平台支持的字符编码,例如 ISO-8859-1。例如:

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

请注意,您仍有可能以 Mojibake 结束当存在非 ASCII 字符时。另请注意,您不应该对所有链接执行此操作,而应仅对抛出 UnsupportedCharsetException 的链接执行此操作(因此,在其 catch block 中执行该作业)。


but I am able to access that in my chrome and why not from Jsoup

那是因为 Chrome 试图对您如此友善,以至于它忽略了未知编码并选择了默认编码——这仍然可能会导致网站在 Mojibake 中显示;超出 ASCII 范围的任何内容都可能看起来格式错误。


connect is used for many websites which include both unicode and bytecode

请复习一下“字节码”这个词的含义。这与字符编码完全无关。

关于java.nio.charset.UnsupportedCharsetException : X-MAC-ROMAN in Jsoup getting a webpage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265001/

相关文章:

java - 如何使用jsoup从html文件中的强标签中检索数据?

java - 如何用 <pre> 解析内容?

java - 用于插入自定义代码 Eclipse 的键绑定(bind)键

java - 为什么 Google 的 Gson 不是静态的?

Java-Jpa-Hibernate 传递分离实体以在合并时保留

java - Jsoup 选择并替换多个 <a> 元素

java - Bouncy CaSTLe,NoSuchMethodError(org.bouncycaSTLe.asn1.ASN1Integer)

utf-8 - 法语字符的字符编码问题

c# - 概率。关于希伯来语编码

node.js - nodejs获取文件字符编码