Подтвердить что ты не робот

Как декодировать HTML-объекты в C?

Мне интересен unescaping text, например: \ maps to \ в C. Кто-нибудь знает о хорошей библиотеке?

В качестве ссылки Wikipedia Список ссылок на XML и HTML-символы.

4b9b3361

Ответ 1

Сегодня у меня было свободное время и написал декодер с нуля: entities.c, entities.h.

Единственная функция с внешней связью -

size_t decode_html_entities_utf8(char *dest, const char *src);

Если src - нулевой указатель, строка будет взята из dest, то есть сущности будут декодированы на месте. В противном случае декодированная строка будет помещена в dest - которая должна указывать на буфер, достаточно большой, чтобы удерживать символы strlen(src) + 1 - и src не изменится.

Функция вернет длину декодированной строки.

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

Ответ 2

Для другой ссылки с открытым исходным кодом в C для декодирования этих объектов HTML вы можете проверить утилиту командной строки uni2ascii/ascii2uni. Соответствующими файлами являются enttbl. {C, h} для поиска сущностей и putu8.c, которые преобразуются с UTF32 в UTF8.

uni2ascii

Ответ 3

Я написал свой собственный unescape-код; очень упрощен, но выполняет работу: pn_util.c

Ответ 4

Описание функции: Преобразование специальных объектов HTML обратно в символы. Нужно сделать некоторые модификации, чтобы соответствовать вашим требованиям.

char* HtmlSpecialChars_Decode(char* encodedHtmlSpecialEntities)
{
int encodedLen = 0;
int escapeArrayLen = 0;
static char decodedHtmlSpecialChars[TITLE_SIZE];
char innerHtmlSpecialEntities[MAX_CONFIG_ITEM_SIZE];

/* This mapping table can be extended if necessary. */
static const struct {
    const char* encodedEntity;
    const char decodedChar;
} entityToChars[] = {
        {"&lt;", '<'},
        {"&gt;", '>'},
        {"&amp;", '&'},
        {"&quot;", '"'},
        {"&#039;", '\''},
    };

if(strchr(encodedHtmlSpecialEntities, '&') == NULL)
    return encodedHtmlSpecialEntities;

memset(decodedHtmlSpecialChars, '\0', TITLE_SIZE);
memset(innerHtmlSpecialEntities, '\0', MAX_CONFIG_ITEM_SIZE);
escapeArrayLen = sizeof(entityToChars) / sizeof(entityToChars[0]);


strcpy(innerHtmlSpecialEntities, encodedHtmlSpecialEntities);
encodedLen = strlen(innerHtmlSpecialEntities);

for(int i = 0; i < encodedLen; i++)
{
    if(innerHtmlSpecialEntities[i] == '&')
    {
        /* Potential encode char. */
        char * tempEntities = innerHtmlSpecialEntities + i;

        for(int j = 0; j < escapeArrayLen; j++)
        {
            if(strncmp(tempEntities, entityToChars[j].encodedEntity, strlen(entityToChars[j].encodedEntity)) == 0)
            {
                int index = 0;
                strncat(decodedHtmlSpecialChars, innerHtmlSpecialEntities, i);

                index = strlen(decodedHtmlSpecialChars);
                decodedHtmlSpecialChars[index] = entityToChars[j].decodedChar;
                if(strlen(tempEntities) > strlen(entityToChars[j].encodedEntity))
                {
                    /* Not to the end, continue */
                    char temp[MAX_CONFIG_ITEM_SIZE] = {'\0'};
                    strcpy(temp, tempEntities + strlen(entityToChars[j].encodedEntity));
                    memset(innerHtmlSpecialEntities, '\0', MAX_CONFIG_ITEM_SIZE);
                    strcpy(innerHtmlSpecialEntities, temp);

                    encodedLen = strlen(innerHtmlSpecialEntities);
                    i = -1;
                }
                else
                    encodedLen = 0;

                break;
            }
        }
    }
}

if(encodedLen != 0)
    strcat(decodedHtmlSpecialChars, innerHtmlSpecialEntities);

return decodedHtmlSpecialChars;

}