4

GB3212 エンコーディング (中国語) のファイルがあります。ファイルはここからダウンロードされますhttp://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO Windows の wget と同じように、ModernChineseCharacterFrequencyList.html ファイル名に保存されます。

以下のコードは、Java がある方法では最後まで読み取ることができず、別の方法ではできることを示しています。

つまり、コードScannerで作成された場合はscanner = new Scanner(src, "GB2312")機能しません。そして、Scannerで作成された場合scanner = new Scanner(new FileInputStream(src), "GB2312")、それは機能します。

区切りパターンの行は、グリッチが残る別のオプションを示しているだけです。

public static void main(String[] args) throws FileNotFoundException {

    File src = new File("ModernChineseCharacterFrequencyList.html");
    //Pattern frequencyDelimitingPattern = Pattern.compile("<br>|<pre>|</pre>");

    Scanner scanner;
    String line;

    //scanner = new Scanner(src, "GB2312"); // does NOT work
    scanner = new Scanner(new FileInputStream(src), "GB2312"); // does work


    //scanner.useDelimiter(frequencyDelimitingPattern);

    while(scanner.hasNext()) {
        line = scanner.next();
        System.out.println(line);
    }

}

これは不具合ですか、それとも仕様による動作ですか?

アップデート

コードが機能する場合、すべてのトークンを最後まで読み取るだけです。機能しない場合は、例外やエラーメッセージなしで、ほぼ途中で読み取りをキャンセルします。

ブレークの場所に特異点は見つかりませんでした。また、2^32 のような「魔法の」数も現れませんでした。

更新 2

元々、この動作は Sun の JavaSE 1.6 を搭載した Windows で発見されました。

そして今、OpenJDK 1.6.0_23 を使用する Ubuntu でも同じ動作が見られます

4

1 に答える 1

1

今は自分の答えをテストすることはできませんが、JDK 6 のドキュメントでは、使用する API に応じてエンコンディングの異なる正規名が提案されています: io または nio

JDK 6 でサポートされるエンコンディング

おそらく、「GB2312」を使用する代わりに、Java I/O の推奨正規名である「EUC_CN」を使用する必要があります。

于 2012-01-05T13:50:05.927 に答える