Вьющиеся кавычки, приводящие к тому, что Java Scanner hasNextLine () ложен - почему?

У меня возникла проблема с получением java.util.Scanner для чтения текстового файла, который я сохранил в Блокноте, хотя он отлично работает с другими. По сути, когда он пытается прочитать файл проблемы, он появляется с пустыми руками - hasNextLine () имеет значение false, буфер пуст и т. Д. Я сузил его до того факта, что он даже не будет читать первую строку, если есть это фигурная цитатав любом месте в файле. Никаких исключений не выбрасывается. Обратите внимание, что BufferedReader в том же файле не имеет проблемы.

try {        
    int count = 0;
    Scanner scanner = new Scanner(new File("C:/myfile.txt"));

    while (scanner.hasNextLine()) {
        count++;
        scanner.nextLine();
    }

    scanner.close();
    System.out.print(count);

    count = 0;
    BufferedReader reader = new BufferedReader(new FileReader("C:/myfile.txt"));

    while (reader.readLine() != null) {
        count++;
    }

    reader.close();
    System.out.print(count);
}
catch(IOException e) {
    e.printStackTrace();
}

Приведенный выше код, читающий файл, который содержит только одну фигурную кавычку, выводит «01». Поиски в Google заставили меня попробовать это:

Scanner scanner = new Scanner(new File("C:/myfile.txt"), "ISO-8859-1");

Это заставляет это работать (то есть это печатает "11"). Я также заметил, что если я захожу в «Блокнот» и выполняю команду «Сохранить как ...», кодировка по умолчанию внизу - «ANSI». Если я изменю это на «UTF-8» и сохраню файл, то сканер (без кодировки) также будет работать. Если я скажу сканеру «UTF-8», то понятно, что он работает, только если я сохраняю как UTF-8, но «ISO-8859-1», кажется, заставляет его работать, даже если я сохраняю его как «ANSI».

Итак, я знаю, что это как-то связано с кодировкой файлов, но проблема в том, что я ничего не понимаю в кодировке файлов. Мои знания о том, что означает «ISO-8859-1», чрезвычайно расплывчаты; почему это работает, независимо от того, как я сохраняю файл? Почему BufferedReader работает независимо?

РЕДАКТИРОВАТЬ:

Ссылки / комментарии ниже действительно помогли мне направиться в правильном направлении! Я думаю, я понял это.

Прежде всего, в блокноте:

"ANSI" - это CP1252«Юникод» - это UTF-16LE"UTF-8" это ... ну, UTF-8

В шестнадцатеричном виде фигурный апостроф представлен как:

CP1252: 92UTF-16LE: 1920UTF-8: E2 80 99

Кодировка по умолчанию, которую Java использует в моей системе, согласно Charset.defaultCharset (), - UTF-8. Поэтому, когда я сохранил файл в UTF-8, сканер знал, чего ожидать. Однако, когда я сохранил файл в CP1252, он задохнулся, когда достиг «92», потому что это недопустимый способ представления символа в этой кодировке. Он работает нормально, если в файле нет таких символов - гекс для «hello world» одинаков как в CP1252, так и в UTF-8 и не вызывает проблем.

UTF-8 не работает с файлом UTF-16, потому что он не знает, что делать с меткой порядка байтов («FFFE»), независимо от того, какие символы находятся в файле.

С другой стороны, когда я устанавливаю сканер на CP1252 или ISO-8859-1, это намного более терпимо. Это не обязательно интерпретировать символыправильноИмейте в виду, но ничто не мешает ему распознавать строки в файле и проходить по ним.

Относительно того, почему у сканера есть проблема, а у FileReader / BufferedReader нет, я собираюсь предположить, что это потому, что сканер должен токенизировать файл, т.е. интерпретировать символы так, чтобы они могли идентифицировать пробелы и другие шаблоны, чтобы он задыхался, когда есть что-то неузнаваемое. Читателю не нужно этого делать. Все, что нужно определить, это разрывы строк.

Ответы на вопрос(3)

Ваш ответ на вопрос