Здравствуйте, Константин Л., Вы писали:
КЛ>VC 7.1, юзается ATL/WTL/boost. Смотрел atlenc.h, там нет.
хотя можно и самому написать, тк список символов для эскейпа невелик: <,>,",',&
Здравствуйте, _Storm, Вы писали:
_S>Здравствуйте, Константин Л., Вы писали:
КЛ>>VC 7.1, юзается ATL/WTL/boost. Смотрел atlenc.h, там нет.
_S>ATL: EscapeToCString,
не знаю что это
_S> AtlEscapeUrl / AtlUnescapeUrl,
эскейпинг для URL отличается от эскейпинга для HTML
_S>EscapeXML ?
да, только в XML "'" эскейпится в "'", а в HTML в "& #39";
Здравствуйте, Константин Л., Вы писали:
КЛ>VC 7.1, юзается ATL/WTL/boost. Смотрел atlenc.h, там нет.
недавна тоже занимался данной темой (юзается только буст). Было сделано такое решение:
Rationale
Сделать unescape (и в будущем escape) строк со следующими свойствами:
гибкость --> ибо существует множество способов escapить строки отличающиеся тем чего собсно и как нужно escapить --> хочется иметь разные escaperы дял этих целей без overhead'a --> шаблоны рулят
в том числе суппорт для wstringов тоже хочется
интеграция со стринговыми функциями из boost::algorithm -- концепт iterator_rangей на практике (и в тестах) показал себя как мегабыстрый по сравнению с string::find и прочими токенайзерами (в том числе из самого буста)
т.е. фактически чтобы (un)escaperы были продолжением бустовых стринговых алгоритмов...
Impl
Для начала надо отделить посик того что можно/нужно (un)escapить от собственно (un)escape'а.
Для этого были сделаны finderы возвращающие iterator_range в оригинальной строке которые можно использовать совместно с make_find_iterator из буста.
Далее остается применять (un)escapящие функторы к найденым местам в строке...
Если цель программы эскейпить кучу всего в разных варияциях, то твоя идея, наверное, хороша. Но вот для того, чтобы в 2х местах анэскейпнуть HTML писать целый framework... Не стоит.
Я прост онаписал простейшую функцию, без притязательств на кроссплатформенность и т.п.:
void UnescapeHTML( ATL::CString& value )
{
value.Replace( _T("&"), _T("&"));
value.Replace( _T("<"), _T("<"));
value.Replace( _T(">"), _T(">"));
value.Replace( _T("""),_T("\""));
value.Replace( _T("& #39;"), _T("'"));//тут конечно, код ' без пробела
}
Здравствуйте, Константин Л., Вы писали:
КЛ>VC 7.1, юзается ATL/WTL/boost. Смотрел atlenc.h, там нет.
Если я правильно понимаю, что значит эскейпить/анэскейпить, то работы на несколько минут
[выдрано из текущего проекта]
txt 2 html
Здравствуйте, Константин Л., Вы писали:
КЛ>Если цель программы эскейпить кучу всего в разных варияциях, то твоя идея, наверное, хороша.
так и есть -- с успехом применяется... и количество unescapящих функторов становится все больше
КЛ>Но вот для того, чтобы в 2х местах анэскейпнуть HTML писать целый framework... Не стоит.
ну я бы тоже не стал елиб это был юнит-тест или демка/прототип какойнить... но в составе проекта я бы всетки это сделал (даже еслиб мне требовалось unescapнуть 2 раза) -- ибо как показывает мой лична опыт луче потратить немного времени и сделать жинериковый и реюзабельный код чем городить постоянно наколеночные варианты одного и тогоже... более того как только ты его сделаешь прочие применения сами собой найдуца -- кроме того никто ведь не заставляет плодить все возможные unescapящие функторы прям щаз... достаточно сделать ровно то что тебе нужно в данный момент, все что понадобится потом буит сделано потом
Здравствуйте, FreshMeat, Вы писали:
FM>Здравствуйте, Константин Л., Вы писали:
КЛ>>VC 7.1, юзается ATL/WTL/boost. Смотрел atlenc.h, там нет. FM>Если я правильно понимаю, что значит эскейпить/анэскейпить, то работы на несколько минут FM>[выдрано из текущего проекта] FM>txt 2 html FM>
FM>> using namespace boost;
FM>>ПС. Насчет производительности не напрагялся
WM>В общем случае это не будет правильно работать, ключевые слова: CDATA-секции, комментарии, numeric-entities.