2009-09-12 3 views
0

Можно создать дубликат:
How to decode HTML Entities in C?конвертировать html-объекты в строки unicode (utf-8) в c?

Этот вопрос очень похож на that one, но мне нужно сделать то же самое в C, не питон. Вот некоторые примеры того, что функция должна сделать:

input output 

&lt;  < 
&gt;  > 
&auml; ä 
&#x00DF; ß 

Функция должна иметь подпись символ * html2str (символ * HTML) или аналогичный. Я не читаю байт по байте из потока.

Есть ли функция библиотеки, которую я могу использовать?

+0

Просьба уточнить. У вас есть html в виде одной строки или вы читаете ее один за другим из потока? – qrdl

ответ

0

Это звучит как работа для flex. Конечно, flex обычно основан на потоках, но вы можете изменить его, используя функцию flex yy_scan_string (или ее родственников). Для получения дополнительной информации см. The flex Manual: Scanning Strings.

Базовая поддержка Unicode от Flex - довольно плохо, но если вы не против кодирования в байтах вручную, это может быть обходным путем. Возможно, есть и другие инструменты, которые могут делать то, что вы хотите.

2

Для выполнения задания не существует стандартной библиотечной функции. В мире Open Source должно быть большое количество реализаций - практически любая программа, которая должна иметь дело с HTML, будет иметь один.

Есть два аспекта проблемы:

  1. Нахождение HTML сущности в исходной строке.
  2. Вставьте соответствующий заменяющий текст на свое место.

Поскольку кратчайший возможный объект равен '& x;' (но, AFAIK, все они используют по крайней мере 2 символа между амперсандом и точкой с запятой), вы всегда будете сокращать строку, поскольку максимально возможное представление символа UTF-8 равно 4 байтам. Следовательно, можно безопасно редактировать in situ.

Есть иллюстрация декодирования сущности HTML в 'The Practice of Programming' от Kernighan и Pike, хотя это делается несколько «мимоходом». Они используют токенизатор для распознавания объекта и отсортированную таблицу имен сущностей плюс значение замены, чтобы они могли использовать двоичный поиск для идентификации замен. Это необходимо только для имен неалгоритмических сущностей. Для объектов, закодированных как '& # x00DF;', вы используете алгоритмический метод их декодирования.