1

私は持っている

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

一部の URL では、例外が発生する場合があります。

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 (IOException  e1)

例外は、Java が Unicode であり、Web ページ/サイトが Unicode に従っていないためであることを理解しています。この問題の処理方法も接続は、ユニコードとバイトコードの両方を含む多くの Web サイトで使用されます

4

1 に答える 1

5

例外は、Java が Unicode であり、Web ページ/サイトが Unicode に従っていないためであることを理解しています。

それは完全に正しくありません。「Java is unicode」というステートメントを、Java が Unicode を使用して文字列/文字をメモリに格納するという事実と混同している可能性があります (ご存知のように、コンピュータのメモリは文字ではなくバイト (0 と 1) しか格納できないため、文字は特定の文字エンコーディングを使用してバイトに変換し、戻すことができます (Java はこれに Unicode を使用しています)。

この例外は、Java コードが実行される基になるオペレーティング システム プラットフォームがこの文字セットをサポートしていないために発生します。そのため、Java は Web サーバーから取得したバイトをこのエンコーディングの文字に変換できません。この文字セットは Mac OS プラットフォームに固有のものであり、Windows などを実行している可能性があります。


この問題を処理する方法

ウェブサイトの管理者に連絡して、バグとして報告してください。ユニバーサル (ISO/UTF) エンコーディングではなく、プラットフォーム固有 (Mac OS) エンコーディングを使用したのは彼らのせいです。

Jsoup に関しては、最初に Web サイトを取得しInputStreamURL#openStream()から、Jsoup#parse()代わりに ISO-8859-1 など、プラットフォームでサポートされている文字エンコーディングを明示的に指定することをお勧めします。例えば:

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

ASCII 以外の文字が存在する場合でも、 Mojibakeが発生するリスクがあることに注意してください。また、すべてのリンクに対して行うのではなく、スローしたリンクに対してのみ行う必要があることに注意してくださいUnsupportedCharsetException(したがって、そのcatchブロックでジョブを実行します)。


しかし、私はクロムでアクセスできますが、なぜJsoupからではありませんか

これは、Chrome が不明なエンコーディングを無視し、代わりにデフォルトのエンコーディングを選択するほどユーザーに親切にしようとしているためです。ASCII の範囲を超えるものは、形式が正しくないように見える可能性があります。


connect は、ユニコードとバイトコードの両方を含む多くの Web サイトで使用されています

「バイトコード」という言葉の意味について語彙を更新してください。これは、文字エンコーディングとはまったく関係ありません。

于 2012-09-04T14:15:30.177 に答える