Какой html-парсер способен обрабатывать кодировку? - PullRequest
1 голос
/ 15 ноября 2011

Это начало - у меня есть файл на диске, который является HTML-страницей.Когда я открываю его в обычном веб-браузере, он отображается так, как должен - т.е. независимо от того, какая кодировка используется, я вижу правильные национальные символы.

Затем я прихожу - моя задача - загрузить тот же файл, разобратьэто, и распечатать некоторые части на экране (консоли) - скажем, все тексты.Конечно, я хотел бы видеть только правильные символы, а не мамбо-юмбо.Последний шаг - изменение текста и сохранение файла.

Таким образом, синтаксический анализатор также должен анализировать и обрабатывать кодирование в обоих направлениях.До сих пор я не знал о парсере, который даже способен правильно загружать данные.

Вопрос

Какой парсер вы бы порекомендовали?

Подробности

HTML-страницав общем случае кодировка указана в заголовке (в метатеге), поэтому парсер должен ее использовать.Сценарий, который я должен посмотреть заранее и проверить кодировку, а затем вручную установить кодировку в коде, не допускается.Например, это взято из руководств JSoup:

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

Я не могу сделать такую ​​вещь, парсер должен сам обрабатывать обнаружение кодировки.


В C # я сталкивалсяаналогичная проблема с загрузкой html.Я использовал HTMLAgilityPack и сначала выполнил обнаружение кодирования, затем, используя его, я зашифровал поток данных, и после этого я проанализировал данные.Итак, я выполнил оба шага в явном виде, но поскольку библиотека предоставляет оба метода, это нормально для меня.

Такое явное разделение может быть даже лучше, поскольку его можно было бы использовать в случае, еслиметода обнаружения недостающего заголовка.

1 Ответ

2 голосов
/ 15 ноября 2011

Справочник по Jsoup API говорит для этого метода синтаксического анализа, что если вы укажете null в качестве второго аргумента (кодирующего), он будет использовать метатег http-equiv для определения кодировки. Таким образом, похоже, что он уже выполняет процедуру «немного разобрать, определить кодировку, повторно проанализировать с правильным кодированием». Обычно такие парсеры должны быть способны самостоятельно разрешать кодировку, используя любые доступные им средства. Я знаю, что парсеры SAX в Java должны использовать метки порядка байтов и объявление XML, чтобы попытаться установить кодировку.

Очевидно, Jsoup по умолчанию будет UTF-8, если не найден правильный метатег. Как говорится в документации, это «обычно безопасно», поскольку UTF-8 совместим с множеством общих кодировок для более низких кодовых точек. Но я полагаю, что в данном случае «обычно безопасно» может быть недостаточно хорошим.

Если вы недостаточно доверяете Jsoup для определения кодировки, я вижу две альтернативы:

  • Если вы каким-то образом удостоверились, что HTML всегда является XHTML, то анализатор XML может оказаться более подходящим. Но это работает только в том случае, если входные данные определенно совместимы с XML.
  • Выполните эвристическое обнаружение кодирования самостоятельно, пытаясь использовать метки порядка байтов, анализируя часть с использованием общих кодировок и находя метатег, обнаруживая кодировку по шаблонам байтов, которые вы ожидаете в тегах заголовка, и, наконец, все остальное терпит неудачу , используйте значение по умолчанию.
...