Ошибка Java? Не могу прочитать файл GB2312 со сканера напрямую

У меня есть файл в кодировке GB3212 (китайский). Файл загружается отсюда http://lingua.mtsu.edu/chinese-computing/statistics/char/list.php?Which=MO как есть с wget под Windows и сохраняется в файле 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

Первоначально поведение было обнаружено в Windows с SunSE Java 1.6

И теперь то же самое поведение также обнаружено в Ubuntu с OpenJDK 1.6.0_23

1 ответ

Я не могу проверить свой ответ прямо сейчас, но документация JDK 6 предлагает различные канонические имена для encons в зависимости от используемого вами API: io или nio

JDK 6 Поддерживаемые Encondings

Возможно, вместо использования "GB2312" вы должны использовать "EUC_CN", который является рекомендуемым каноническим именем для ввода-вывода Java.

Другие вопросы по тегам