Мне интересен unescaping text, например: \
maps to \
в C. Кто-нибудь знает о хорошей библиотеке?
В качестве ссылки Wikipedia Список ссылок на XML и HTML-символы.
Мне интересен unescaping text, например: \
maps to \
в C. Кто-нибудь знает о хорошей библиотеке?
В качестве ссылки Wikipedia Список ссылок на XML и HTML-символы.
Сегодня у меня было свободное время и написал декодер с нуля: entities.c, entities.h.
Единственная функция с внешней связью -
size_t decode_html_entities_utf8(char *dest, const char *src);
Если src
- нулевой указатель, строка будет взята из dest
, то есть сущности будут декодированы на месте. В противном случае декодированная строка будет помещена в dest
- которая должна указывать на буфер, достаточно большой, чтобы удерживать символы strlen(src) + 1
- и src
не изменится.
Функция вернет длину декодированной строки.
Обратите внимание, что я не проводил обширного тестирования, поэтому существует высокая вероятность ошибок...
Для другой ссылки с открытым исходным кодом в C для декодирования этих объектов HTML вы можете проверить утилиту командной строки uni2ascii/ascii2uni. Соответствующими файлами являются enttbl. {C, h} для поиска сущностей и putu8.c, которые преобразуются с UTF32 в UTF8.
Я написал свой собственный unescape-код; очень упрощен, но выполняет работу: pn_util.c
Описание функции: Преобразование специальных объектов 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[] = {
{"<", '<'},
{">", '>'},
{"&", '&'},
{""", '"'},
{"'", '\''},
};
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;
}