sax_html и UTF8

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

sax_html и UTF8

Сообщение vk_barnaul » 21.09.2015 05:55:42

использую ReadHTMLFile(out ADoc: THTMLDocument; f: TStream) из packages\fcl-xml\src\sax_html.pp
проблема при парсинге страниц в UTF8
в процедуре procedure THTMLReader.Parse(AInput: TSAXInputSource) читается очередной кусок страницы в Buffer: array[0..MaxBufferSize - 1] of Char;
и потом идет посимвольный разбор. проблема в том, что на каком-то этапе (когда встретим что-то типа charset="UTF-8") мы понимаем, что stream в кодировке UTF8, а значит символ может состоять не из одного байта, а из двух. может кто-то предложит элегантное решение этого момента ?
vk_barnaul
незнакомец
 
Сообщения: 5
Зарегистрирован: 19.09.2015 04:48:21

Re: sax_html и UTF8

Сообщение Cheb » 21.09.2015 11:34:28

Нужен ещё один, кодировкодекодирущий поток. Из которого будут читаться UnicodeChar'ы. И разборку ведёшь уже в юникоде.
Этот промежуточный поток внутри себя читает из источника, даёт на выход, перекодируя. Сначала кодипровка по умолчанию и всё буферизуется (например, в TMemoryStream). Как только кодировка стала известна - информируешь поток-декодер об этом, и перезапускаешь разбор с начала. Тот выдаёт начало из буфера, потом переключается на поток-источник, таким образом, источнику не нужно уметь делать Seek.

Это IMO единственный способ, поелику тег с заголовком какие-нить дятлы могут вставить *до* тега с кодировкой.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: sax_html и UTF8

Сообщение vk_barnaul » 21.09.2015 19:54:44

немного углубившись в алгоритм я пришел к выводу, что вполне безопасно парсить UTF8 страницы и в том виде в котором есть. По крайней мере пока я не обнаружил проблемы. А почему у меня возник вообще вопрос - я заметил что парсится странички не совсем так как хотелось бы. И первое что увидел, что парсинг идет посимвольный, поэтому и подумал, что проблема в кодировке UTF8 и многобайтных символах. Проблема оказалась в другом:
unit SAX_HTML;
....
procedure THTMLToDOMConverter.ReaderEndElement(Sender: TObject;
....
вызывается реадером каждый раз, когда "закрываем" какой-нибудь тэг. Т.к. html странички бывают совсем разные, в том числе и не совсем корректные автор алгоритма держит список обработанных, но не закрытых тэгов в списке FElementStack. При очередном закрытии тэга (назовем Node1) находим самый последний не закрытый с нужным нам именем и всё что не закрылось до него закрываем и делаем их детьми Node1.AppendChild.
сам элемент Node1 оставляем в стэке, чтобы кто-нибудь его сделал своим "ребенком". Но если в следующий раз закроется тэг с таким же именем, мы вместо того чтобы закрыть следующий элемент опять видим Node1 и радостно работаем с ним.
Хорошо и наглядно это можно увидеть обработав что-то типа этого:
<html>
<div id="level1">
<div id=level2">
<div id="level3">
</div>
</div>
</div>
</html>

вместо вложенного три раза div получим список одноуровневый список из трех div. т.к. судя по SVN это не менялось с 2005 года - никто с таким не сталкивался.
разубедите, плз, меня = где я не прав ??
vk_barnaul
незнакомец
 
Сообщения: 5
Зарегистрирован: 19.09.2015 04:48:21

Re: sax_html и UTF8

Сообщение Sergei I. Gorelkin » 22.09.2015 09:37:01

Исправлено в ревизии 31773.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: sax_html и UTF8

Сообщение vk_barnaul » 22.09.2015 12:38:48

спасибо огромное. скачаю и буду пробовать.

Добавлено спустя 4 часа 35 минут 39 секунд:
посмотрел. что интересно - я костыль делал точно такой же - переменная только называлась не Closed :)
правда я во всех местах где добавляются элементы в FNodeBuffer поставил присвоение ей в false. Я понимаю что память выделяемая под нужды класса должна обнуляться и соответственно false. но как-то хочется быть в этом уверенным, что через несколько лет данный код будет работать и без надежды на то, что вся выделяемая память предварительно обнуляется. еще раз огромно спасибо Sergei I. Gorelkin.
vk_barnaul
незнакомец
 
Сообщения: 5
Зарегистрирован: 19.09.2015 04:48:21


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47

Рейтинг@Mail.ru