
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.148.127] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Вот есть пример использования std::quoted: https://en.cppreference.com/w/cpp/io/manip/quoted ![]() ![]() #include <iostream> #include <iomanip> #include <sstream> void default_delimiter() { const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too"; std::stringstream ss; ss << std::quoted(in); std::string out; ss >> std::quoted(out); std::cout << "Default delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } void custom_delimiter() { const char delim {'$'}; const char escape {'%'}; const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too"; std::stringstream ss; ss << std::quoted(in, delim, escape); std::string out; ss >> std::quoted(out, delim, escape); std::cout << "Custom delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } int main() { default_delimiter(); custom_delimiter(); } ![]() ![]() Default delimiter case: read in [std::quoted() quotes this string and embedded "quotes" too] stored as ["std::quoted() quotes this string and embedded \"quotes\" too"] written out [std::quoted() quotes this string and embedded "quotes" too] Custom delimiter case: read in [std::quoted() quotes this string and embedded $quotes$ $too] stored as [$std::quoted() quotes this string and embedded %$quotes%$ %$too$] written out [std::quoted() quotes this string and embedded $quotes$ $too] Внимание смотрим на stored as - ну че за говно? Откуда там взялось "" начальные? |
Сообщ.
#2
,
|
|
|
Странно, где вы тут баг увидели? Входная строка (read in) в точности соответствует выходной строке (written out).
А в stored as он сохранил все правильно (с экранированием). Если в строке встречается escape или delim тогда к ним подставляется еще один escape при << и удаляется при >>. ![]() ![]() #include <iostream> #include <iomanip> #include <sstream> void default_delimiter() { const std::string in = "std::quoted() quotes \\% this string and embedded \"quotes\" too"; std::stringstream ss; ss << std::quoted(in); std::string out; ss >> std::quoted(out); std::cout << "Default delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } void custom_delimiter() { const char delim {'$'}; const char escape {'%'}; const std::string in = "std::quoted() quotes \\% this string and embedded $quotes$ $too"; std::stringstream ss; ss << std::quoted(in, delim, escape); std::string out; ss >> std::quoted(out, delim, escape); std::cout << "Custom delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } int main() { default_delimiter(); custom_delimiter(); } Скрытый текст Обратите внимание на escape символы после слова quotes ![]() ![]() Default delimiter case: read in [std::quoted() quotes \% this string and embedded "quotes" too] stored as ["std::quoted() quotes \\% this string and embedded \"quotes\" too"] written out [std::quoted() quotes \% this string and embedded "quotes" too] Custom delimiter case: read in [std::quoted() quotes \% this string and embedded $quotes$ $too] stored as [$std::quoted() quotes \%% this string and embedded %$quotes%$ %$too$] written out [std::quoted() quotes \% this string and embedded $quotes$ $too] |
Сообщ.
#3
,
|
|
|
Цитата macomics @ А в stored as он сохранил все правильно (с экранированием). Мне надо строку заэкранировать и послать в JSON, начал гуглить что есть в плюсах, нашел эту функцию std::quoted, вроде она делает то, что надо, но добавляет в начало и конец строки - кавычки. Теперь от них избавляться надо по тупому. Причем она их добавляет, но не экранирует. Спрашивается нафига вообще эта функция нужна? Какой в ней смысл? Она экранирует кавычки и добавляет неэкранированные ковычки. Лол. Добавлено Цитата macomics @ Входная строка (read in) в точности соответствует выходной строке (written out). А в чем смысл этой функции вообще? Строку в кавычки обернуть? Вечно в плюсах все через жопу. Лучше бы сделали отдельно, функцию - которая оборачивает строку кавычками. А не пихали все в кучу. |
Сообщ.
#4
,
|
|
|
Цитата Wound @ А в чем смысл этой функции вообще? Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON. |
Сообщ.
#5
,
|
|
|
Цитата Wound @ А в чем смысл этой функции вообще? Получается, она из текста делает корректный литерал, который будет содержать этот текст. Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя Добавлено Цитата macomics @ Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON. Думаю, когда это писали, JSON просто не был популярен |
Сообщ.
#6
,
|
|
|
Цитата macomics @ Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON. А кому это нужно? Вместо чего то юзабельного - нарисовать какую то шнягу, которую вообще никто и никогда в жизни не будет юзать. Добавлено Цитата kopilov @ Думаю, когда это писали, JSON просто не был популярен Кого этописали? Эту функцию? std::quoted ? Она появилась судя по доке в С++14, в те времена XML отмер уже окончательно, передав бразды правления JSON'у |
Сообщ.
#7
,
|
|
|
Сообщ.
#8
,
|
|
|
Цитата kopilov @ Получается, она из текста делает корректный литерал, который будет содержать этот текст. Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя Чего она делает? Функция экранирует строку, типа написал ты A\", она тебе вернет "A\\\"", сама строка вот так будет выглядеть. Понимаешь? В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после " . Так что я вообще не понимаю зачем эта функция нужна. Я на нее набрел случайно, когда искал как экранировать строку в плюсах. |
Сообщ.
#9
,
|
|
|
Цитата Wound @ В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после " Для CSV это как раз очень удобно. |
Сообщ.
#10
,
|
|
|
Цитата Wound @ Так что я вообще не понимаю зачем эта функция нужна Как пример, для кодогенерации. stc::cout << "A\\\"" ; // выведет A\" Ну и с записью в прочие (кроме исходного кода) человеко-машино-читаемые форматы то же самое |
Сообщ.
#11
,
|
|
|
Цитата macomics @ Для CSV это как раз очень удобно. Есть много чего удобно, чего нет в плюсах. Зачем тогда эту функцию вводить стандарт - если она пилится для CSV и XML ? В плюсах - кавычки к строке добавить или обернуть строку в кавычки - это очень плевое дело, да хоть тем же форматом. А вот удалить из строки кавычки - без пол литра не разобраться. Зачем пилить говно функцию - которая нужна для каких то xml и тащить ее в плюсы? Как по мне обычное экранирование строк на порядки порядков чаще встречается, чем вот это все. Плюс если мне надо будет работать с XML, или CSV - я лучше возьму готовые библиотеки, чем буду извращаться на голых плюсах писать что то. Короче подход как всегда. Понавводить всякой шняги, при этом не нужной. Добавлено Цитата kopilov @ Как пример, для кодогенерации. stc::cout << "A\\\"" ; // выведет A\" Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь? |
Сообщ.
#12
,
|
|
|
Цитата Wound @ Зачем вам для чтения текстового файла какие-то специальные библиотеки? люс если мне надо будет работать ... или CSV |
Сообщ.
#13
,
|
|
|
Цитата macomics @ Зачем вам для чтения текстового файла какие-то специальные библиотеки? А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты? Желательно не портянкой вырвиглазной и багнутой, а парой тройкой строк кода ? Если вы не в силах это вопроизвести тут и сейчас, то вам стоило бы промолчать и пройти мимо, а не писать то что вы пишете. Или вы когда писали свой бред, то акцент делали на слово "для чтения" ? Если так, то я про "чтение" ничего не писал. Я писал про работу с конкретными форматами(кстати какое отношение вышеперечисленные форматы имеют к плюсам) ? Может еще какой нибудь Exel формат добавить в плюсы? |
Сообщ.
#14
,
|
|
|
Цитата Wound @ Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь? Разницу вижу. Не вижу, откуда взялся "\"A\\\"\"" ОК, держи полный пример. ![]() ![]() #include <iostream> #include <iomanip> int main(int argc, char** argv) { std::cout << "#include <iostream>" << std::endl; std::cout << "int main(int argc, char** argv) {" << std::endl; std::cout << " //We should print " << argv[1] << std::endl; std::cout << " //equivalent literal is " << std::quoted(argv[1]) << std::endl; std::cout << " std::cout << " << std::quoted(argv[1]) << " << std::endl;" << std::endl; std::cout << "}" << std::endl; } Сохраним, как generator.cpp, скомпилируем один раз. Сгенерируем несколько шаблонных кодов. (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo) ![]() ![]() :~$ g++ -o generator generator.cpp :~$ ./generator '\' > generated1.cpp :~$ ./generator '"' > generated2.cpp :~$ ./generator 'A\"' > generated3.cpp Читаем получившиеся файлы (для понимания). И запускаем. ![]() ![]() :~$ g++ -o generated1 generated1.cpp :~$ g++ -o generated2 generated2.cpp :~$ g++ -o generated3 generated3.cpp :~$ ./generated1 \ :~$ echo '\' \ :~$ ./generated2 " :~$ echo '"' " :~$ ./generated3 A\" :~$ echo 'A\"' A\" Видим, что каждый сгенерированный исходник сохранил в человеко-машино-читаемом виде то, что было непосредственно задано при генерации |
Сообщ.
#15
,
|
|
|
Цитата Wound @ А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты? Вы не заметили, что я убрал XML. Я работаю с CSV и это очень удобно без каких-либо дополнительных библиотек. Цитата kopilov @ (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo) Linux, кстати, тоже использует эту самую std::quoted для работы с командной строкой. Это тоже удобно для запуска внешних программ использовать. |
![]() |
Сообщ.
#16
,
|
|
Очевидно же, что функция предназначена для работы со строками в форматах, где строки окавычиваются, а кавычки в качестве обычных элементов, а не ограничителей строки, обрабатываются, также, как и в Плюсах. Ровно это она и делает. Без этого формировать или парсить такие значения на Плюсах неудобно, придётся самому корёжить строку со встроенными " при выводе и парсить при чтении. Причём регулярками это хрен так легко сделаешь, т.к. нужно учитывать \ перед ", которые будут не ", и ещё \ перед \, которые не будут \, так что даже банальным циклом не так просто заморочиться. Если б дело было просто в расстановке/удалении кавычек по краям, вопроса б не было.
|
Сообщ.
#17
,
|
|
|
Цитата macomics @ Вы не заметили, что я убрал XML. Заметил вообще то, но ты упор сделал на чтении текстовых файлов, а не на CSV, XML - вполне себе текстовый файл. Цитата kopilov @ Не вижу, откуда взялся "\"A\\\"\"" Так функция же добавила. Добавлено Цитата Qraizer @ Очевидно же, что функция предназначена для работы со строками в форматах, где строки окавычиваются, а кавычки в качестве обычных элементов, а не ограничителей строки, обрабатываются, также, как и в Плюсах. Ровно это она и делает. Без этого формировать или парсить такие значения на Плюсах неудобно, придётся самому корёжить строку со встроенными " при выводе и парсить при чтении. Я уже понял что она делает. Она какую то узконаправленную задачу решает, которая нужна макомиксу для чтения CSV файлов, и похоже что все. А еще кто то ее в линуксах юзает. Зато про экранировать строку - разрабы стандарта похоже не слышали. Зачем делать такую сложную функцию? Не проще ли сделать 2 - одна для экранирования, вторая для того чтоб кавычить? |
![]() |
Сообщ.
#18
,
|
|
P.S. У меня вот шелезяка выдаёт в RS-232 строку приглашения с версией, которую надо парсить, чтоб убедиться, что шелезяка работает. Причём ещё шелезяки разных ревизий отличаются этими строками. Сделал .ini, в котором расписал все возможные строки и соответствующие им версии. И всё бы ничего, если б в этих строках не могли встречаться спец.символы, те же \n или \t, например. Так что пришлось руками хреначить целую единицу трансляции, чтоб забрать строки из .ini в формате строковых литералов Плюсов и представить их в качестве корректного символьного массива. На вскидку: \n, \r, \a, \b, \f, \t, \v, \', \", \?, \\ – лепота; \xHH, \OOO – м-м-м как интересно; а самый смак \uXXXX, \UXXXXXXXX. Вот от какого манипулятора я бы не отказался. Особенно от двух последних, ибо кастить юникоды через локали то ещё удовольствие
Добавлено Цитата Wound @ Не проще. Что делать со строкойНе проще ли сделать 2 - одна для экранирования, вторая для того чтоб кавычить? ![]() ![]() Бегемот сказал "бла-бла-бла" и выпрыгнул на ходу, а водитель подумал "идиот" ![]() ![]() "Бегемот сказал "бла-бла-бла" и выпрыгнул на ходу, а водитель подумал \"идиот\" Добавлено P.S. Кавычки в примерах расставлены именно так, как я хотел. Добавлено Ты, Wound, наверное, никогда не сталкивался с необходимостью квалифицировать свои инструменты на отказоустойчивость и достигать 100% структурного покрытия блоков, операторов, решений и условий для этого. Работать в идеальном или хотя бы в адекватно себя ведущем исполнительном окружении всегда хочется, но нельзя, приходится предусматривать возможность мульёна разных багов со стороны, которую ты не контролируешь. Так что тебе на вход может прилететь невесть что и как оформленное, и вон те примеры, наполовину такие, а на другую половину недосякие, вполне будут реальны, если не решать обе задачи std::quoted одновременно. А оно надо кому? |
Сообщ.
#19
,
|
|
|
Цитата Qraizer @ Не проще. Очень странно. Функция ведет себя как то иначе при разных условиях или что? Цитата Qraizer @ при окавычивании, ещё понятно, а что делать с Ровно то же, что делает эта функция - экранировать и окавычить. Не понимаю смысла вопросов. Я тебе пишу - берем эту функцию и делим на 2 функции. Ты спрашиваешь - и что делать вот с такой строкой. Ну как что? Если раньше ты вызывал 1 функцию, то теперь одну передашь в другую делов то. А вот встречный вопрос, что делать если мне надо просто экранировать символы в строке? Вот что мне делать? Писать свой велосипед? Т.е. какую то шнягу они в стандарт затащили, а то что вылезает везде где пользователь что то вводит, пароль например со спец символами - они сделать не додумались. Ну супер. |
![]() |
Сообщ.
#20
,
|
|
Цитата Wound @ Хм. А вот вызвал я окавычивание, а экранирование не стал. особенно. Если там изначально баг с расстановкой кавычек. На, разгребай при чтении:Я тебе пишу - берем эту функцию и делим на 2 функции. Ты спрашиваешь - и что делать вот с такой строкой. Ну как что? Если раньше ты вызывал 1 функцию, то теперь одну передашь в другую делов то. ![]() ![]() "Бегемот сказал "бла-бла-бла" и выпрыгнул на ходу, а водитель подумал «идиот" ![]() ![]() <pr>"Бегемот сказал "бла-бла-бла" и выпры гнул на ходу, а водитель подумал «идиот"</pr> Добавлено Не забывай, ты разговариваешь, с профессиональным ![]() Добавлено Цитата Wound @ На все случаи жизни библиотек не напасёшься. Зато есть универсальные, которые позволяют тебе нахреначить любую грамматику, какую захочешь. Придумывай формат или бери имеющийся готовый, описывай её в каком-нибудь boost::spirit, и радуйся на здоровье.А вот встречный вопрос, что делать если мне надо просто экранировать символы в строке? Вот что мне делать? Писать свой велосипед? Так-то я не спорю, что фича малость сахарная. С другой стороны тогда это был бы не легковесный IO-манипулятор, тогда как просили как раз о нём. |
Сообщ.
#21
,
|
|
|
Цитата Qraizer @ Хм. А вот вызвал я окавычивание, а экранирование не стал. особенно. Если там изначально баг с расстановкой кавычек. Это вопросы из серии если бы, да кабы. Вон тебя не смущает всякие функции std::remove_if ? Иди удали элемент. Да фиг там, сидишь и думаешь - а че случилось, вроде хотел удалить, а ничего не произошло. А тут еще какой то std::erase Надо вызвать. Вот жеж. И никого это не смущает, еще и за фичу выдавать будете. Че не сделать нормальный remove_if, который именно что удаляет, а не занимается фигней? Вот так и тут. Забыл экранирование вызвать? Ну значит оно тебе и не нужно было. Попробуй невалидный итератор передать в функцию remove_if - будет тоже самое что и в твоем случае. А вообще даже если у тебя там баг с расстановкой кавычек, эта функция тебе еще две добавит и все. Она судя по всему именно так и работает. Цитата Qraizer @ Добавь туда для гарантии EOLолов или наоборот убери, если они там есть Я вообще не понимаю сути вопроса. Да понапихай туда всего чего надо и не надо, еще и бинарных нечитаемых символов напихай. И чего? Функция все что делает - это экранирует уже существующие кавычки и другие знаки + всегда, хоть у тебя там в начале уже 100 кавычек - она добавит еще по одной ковычке - спереди и сзади. Какой в этом толк то? Вы мне рассказываете вам в линуксе с этим удобно или CSV парсить? Лол. Так в чем вопрос - смотрите еще раз: Берем эту функцию, делим ее на две, одна экранирует, вторая окавычивает. И все. В итоге теперь это все можно использовать еще и для экранирования !!! Но нет же. Надо обязательно создать какую то узконаправленную функцию, которая нужна трем с половиной челам, и то в теории. На практике они скорее ее не юзали эту функцию никогда в жизни, и скорее всего узнали о ней либо только сейчас, либо где то как то краем уха слышали. Цитата Qraizer @ На все случаи жизни библиотек не напасёшься. Зато есть универсальные, которые позволяют тебе нахреначить любую грамматику, какую захочешь. Придумывай формат или бери имеющийся готовый, описывай её в каком-нибудь boost::spirit, и радуйся на здоровье. Зачем мне Boost ? У меня резко нарисовался баг в мелкой тулзе, в пароль передали спецсимволы типа кавычки, и сервак не распарсил это. Нужно было просто экранировать строку. И никто из вас так и не написал, как же мне экранировать строку? В общем то я уже сделал задачу, просто интересно от местных услышать. А то всякие байки о том, какая эта функция важная из за того что помимо того что экранирует еще и кавычит, рассказываете. |
Сообщ.
#22
,
|
|
|
Цитата Wound @ И никто из вас так и не написал, как же мне экранировать строку? Перечитайте свой первый пост. Вы там ни о чем таком не просили. Писали, что баг нашли... Скрытый текст Если надо избавиться от кавычек, тогда что мешает сделать так ![]() ![]() #include <iostream> #include <iomanip> #include <sstream> void default_delimiter() { const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too"; std::stringstream ss; ss << std::quoted(in); std::string out; ss >> std::quoted(out); std::cout << "Default delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str().substr(1,ss.str().size() - 2) << "]\n" "written out [" << out << "]\n\n"; } void custom_delimiter() { const char delim {'$'}; const char escape {'%'}; const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too"; std::stringstream ss; ss << std::quoted(in, delim, escape); std::string out; ss >> std::quoted(out, delim, escape); std::cout << "Custom delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str().substr(1,ss.str().size()-2) << "]\n" "written out [" << out << "]\n\n"; } int main() { default_delimiter(); custom_delimiter(); } ![]() ![]() Default delimiter case: read in [std::quoted() quotes this string and embedded "quotes" too] stored as [std::quoted() quotes this string and embedded \"quotes\" too] written out [std::quoted() quotes this string and embedded "quotes" too] Custom delimiter case: read in [std::quoted() quotes this string and embedded $quotes$ $too] stored as [std::quoted() quotes this string and embedded %$quotes%$ %$too] written out [std::quoted() quotes this string and embedded $quotes$ $too] |
![]() |
Сообщ.
#23
,
|
|
Цитата Wound @ Потому что алгоритм ничего не знает о контейнерах, итераторы которого ему переданы в обработку. К тому же не факт, что я захочу их удалить из контейнера, а не, скажем, передать в очередной алгоритм. Другое дело, если б он назывался erase_if(), но ведь он remove_if(), а значит не уничтожает, а убирает за пределы диапазона, определяемого итераторами. Че не сделать нормальный remove_if, который именно что удаляет, а не занимается фигней? Впрочем, тут это оффтоп. Так-то всё достаточно подробно объяснено в соответствующей литературе. Цитата Wound @ Ну вот с чего ты взял, что всё не с точностью до наоборот, и это ты входишь в число 3,5 человек, а? Просили сделать простой манипулятор, чтобы строки можно было просто форматировать под протоколы, которые требуют заключать их в кавычки. Если б дело было в простыхНо нет же. Надо обязательно создать какую то узконаправленную функцию, которая нужна трем с половиной челам, и то в теории. ![]() ![]() auto toOutput = [](const std::string& str){ return '"' + myString + '"'; }; auto fromInput= [](const std::string& str){ return str.substr(str.start_with('"'), str.length() - str.end_with('"') - str.start_with('"')); }; Цитата Wound @ Ябеспонятия, что тебе было надо. И даже сейчас тоже беспонятия, что ты понимаешь под понятием экранирования. Что там надо твоему серверу, мне неведомо. Возможно у вас плохой сервер, выкинете его на свалку и возьмите хороший. У меня резко нарисовался баг в мелкой тулзе, в пароль передали спецсимволы типа кавычки, и сервак не распарсил это. Нужно было просто экранировать строку. И никто из вас так и не написал, как же мне экранировать строку? Как по мне, мне нужен манипулятор, который полностью хендлит любые ESC, как вон я выше описывал. |
Сообщ.
#24
,
|
|
|
Цитата macomics @ Вы там ни о чем таком не просили. Там не писал, а дальше написал. И да, цель не в том чтобы написать это в принципе, потому что я не умею. Я и сам могу написать, цель в том, что б сделать это лаконично и по феншуюю. Другими словами - если что то подобное для этого уже есть в STL, а ты напишешь свой велосипед - то это уже будет не круто, конечно если ты не обоснуешь что твой велосипед круче, чем то, что уже например есть. Добавлено Цитата Qraizer @ Другое дело, если б он назывался erase_if(), но ведь он remove_if(), а значит не уничтожает, а убирает за пределы диапазона, определяемого итераторами. первый - стереть_если, второй удалить_если. Что первый, что второй по своему смыслу предпоалагет как раз уничтожение элементов, а не убирание за пределы диапазона. Имена функций вводят в ступор новичков - это факт, их названия попросту не отражают то что они делают. Цитата Qraizer @ Ну вот с чего ты взял, что всё не с точностью до наоборот, и это ты входишь в число 3,5 человек, а? Из простой логики, если есть два действия, одно сложное(составное), а второй простое, и сложное включает в себя простое, то значит простое по определению будет использоваться чаще, чем сложное. Хотя бы потому, что сложное включает простое. И даже если все будут использовать только лишь сложное, то простое в этом случае будет использоваться не меньше сложного по количеству раз. Цитата Qraizer @ Как по мне, мне нужен манипулятор, который полностью хендлит любые ESC, как вон я выше описывал. Я ж выше написал. Ты давно регился на ресурсах? Там в паролях предлагается юзать спецсимволы - ",/,|,\,! ну типа этих. Очевидно что некоторые из них, если их не экранировать - будут создавать ошибки. В командной строке, передаче по сети в различных текстовых форматах и т.д. Как по мне, своей фразой "мне нужен манипулятор", ты уже намекаешь на какую то портянку кода. Для какой то тривиильной задачи, которая встречается очень часто. При наличии у тебя функции похожей которая делает то что надо, плюс еще пихает что то левое правда. Писать класс, для того чтоб в одном месте его вызвать - как по мне уже слишком . Че реплейсом не сделать? Хотя есть и без манипуляторов решения. |
Сообщ.
#25
,
|
|
|
Ну и плюс ко всему, плюсы изначально делались так, что в них есть кирпичи, а ты из них что то строишь и это было круто. Нужен тебе кирпич в форме буквы Г, ты взял три кирпича, слепил из них букву Г, и вуаля. А с новыми стандартами - в язык начали тащить всякую чушь, в погоне за всякими новомодными языками. И вместо того чтоб следовать принципу - ты дай кирпичь, а уж букву Г я и сам слеплю, решили пойти по тупому пути. И добавлять уже целые алгоритмы, которые объединяются и представляют из себя нечто очень узконаправленное. При этом по отдельности - эти алгоритмы не реализованы. И в итоге получается ситуация, букву П слепили и засунули в библиотеку из 5 кирпичей, а букву Г не додумались. В итоге получается черти что и с боку бантик. Вы или тогда уже как в тех языках, за которыми вы гонитесь, вводите все подряд, либо делайте кирпичи, а уж пользователь сам разберется какую фигуру ему из них сложить надо. Потому что все это вызывает массу вопросов.
Добавлено Цитата macomics @ Если надо избавиться от кавычек, тогда что мешает сделать так Мешает то, что это костыль, причем жесткий. Добавлено Ну и в третий раз спрошу - будут примеры того, как по феншую экранировать символы в строке, в плюсах? Если что, один из вариантов решения я уже запилил, но он больше похож на то, как стрельба из пушки по воробьям. Но в принципе че делать, если комитетчики не могут базовые алгоритмы в язык ввести, зато всякую чушь тащут. |
Сообщ.
#26
,
|
|
|
Цитата Wound @ Мне надо строку заэкранировать и послать в JSON, начал гуглить что есть в плюсах, нашел эту функцию std::quoted, вроде она делает то, что надо, но добавляет в начало и конец строки - кавычки. Теперь от них избавляться надо по тупому Можешь чуть подробнее рассказать? Зачем избавляться от кавычек, если в json строковые объекты тоже в кавычках задаются? Добавлено Или ты весь json сразу через это гоняешь? |
Сообщ.
#27
,
|
|
|
Цитата D_KEY @ Можешь чуть подробнее рассказать? Зачем избавляться от кавычек, если в json строковые объекты тоже в кавычках задаются? Попробуй выполнить следующий код: ![]() ![]() #include <iostream> int main() { std::string user = "Admin"; std::string password = "P@$$w0rd\"!!1"; std::string jsonRequest = "{\"Username\":\"" + user + "\",\"Password\":\"" + password + "\"}"; std::cout << jsonRequest << std::endl; } Получишь строку со следующим содержимым ![]() ![]() {"Username":"Admin","Password":"P@$$w0rd"!!1"} Потом, ну если уж совсем наглядно, скопируй выходную эту строку, и подставь ее аргументом в POST запрос например CURL тулзы. Скорее всего ты получишь ошибку, что то типа: Цитата HTTP/1.1 400 Bad Request ... {"errors":{"Password":["After parsing a value an unexpected character was encountered: 7. Path 'Password', line 1, position 53."]},"type":"https://tools.ietf.org/html/rfc7231#section...quot;:"One or more validation errors occurred.","status":400... Для того, чтоб кавычка в поле Password была законной, ее нужно экранировать для формата JSON(и не только для него, в линуксе например в командной строке наблюдаются глюки, когда вводишь ! знак в строке запроса, в качестве пароля, сносит башню и bash уже не отображает нормально историю запроса, скорее всего это как то связано с неэкранированием символа, ну короче ноги растут от туда). А чтоб запрос был правильным, надо строку с паролем(да и с юзером тоже) экранировать, чтоб запрос выглядел вот так: ![]() ![]() {"Username":"Admin","Password":"P@$$w0rd\"!!1"} Добавлено Цитата D_KEY @ Или ты весь json сразу через это гоняешь? Поле Password и User только экранировать надо. Зачем же весь json ? ты как с CURL'ом не работал что ле? Или с другой тулзой, где надо данные в json формате гонять ? Добавлено Цитата D_KEY @ Зачем избавляться от кавычек, если в json строковые объекты тоже в кавычках задаются? В том и дело, что в JSON, они либо все экранируются слешами, либо только строки в кавычках. А тут что внутри - экранирует, при этом по краям добавляет кавычки, не экранированные. Т.е. получаешь строку "P@$$w0rd\"!!1" с неэкранированными кавычками. |
Сообщ.
#28
,
|
|
|
Цитата Wound @ Поле Password и User только экранировать надо Именно. И граничные кавычки тоже доверить системному экранированию, а не самостоятельно вставлять. Причём для названий атрибутов это тоже работает. Попробуй выполнить следующий код: ![]() ![]() #include <iostream> #include <iomanip> int main() { std::string user = "Admin"; std::string password = "P@$$w0rd\"!!1"; std::stringstream jsonRequest; jsonRequest << "{" << std::quoted("Username") << ":" << std::quoted(user) << "," << std::quoted("Password") << ":" << std::quoted(password) << "}"; std::cout << jsonRequest.str() << std::endl; } Добавлено Как ты сам сказал, «или либа, или кирпичи». Если доверяешь либе экранирование — доверяй до конца |
Сообщ.
#29
,
|
|
|
Wound, так зачем ты кавычки сам добавляешь при формировании json? std::quoted их уже добавила.
Добавлено Цитата Wound @ В том и дело, что в JSON, они либо все экранируются слешами, либо только строки в кавычках. А тут что внутри - экранирует, при этом по краям добавляет кавычки, не экранированные. Т.е. получаешь строку "P@$$w0rd\"!!1" с неэкранированными кавычками. Так и в json нужны кавычки обрамляющие у строкового значения. Как ты формируешь json? Если через какую-то библиотеку, то она сама должна экранировать все, если сам, то просто не добавляй свои кавычки, делай через std::quoted. |
Сообщ.
#30
,
|
|
|
Цитата D_KEY @ Wound, так зачем ты кавычки сам добавляешь при формировании json? std::quoted их уже добавила. Это не я. Оно так было. И было там без экранирования, это же пример. Добавлено Цитата kopilov @ Именно. И граничные кавычки тоже доверить системному экранированию, а не самостоятельно вставлять. Так в том и дело что граничные кавычки не экранируются, а просто вставляются, безусловно. О чем и речь. |
Сообщ.
#31
,
|
|
|
Читал-читал, так и не понял. Wound нашел багу или фичу?
![]() |
Сообщ.
#32
,
|
|
|
Цитата Wound @ Так в том и дело что граничные кавычки не экранируются, а просто вставляются, безусловно. О чем и речь. Ну так они правильно вставляются. Просто не вставляй еще одни. Добавлено Цитата Wound @ Это не я. Оно так было. Ну так убери оттуда кавычки при использовании quoted и будет то, что надо ![]() Добавлено И еще интересно, как ты думаешь, что означает quoted на английском? |
Сообщ.
#33
,
|
|
|
Что делает std::quoted, есть ли там бага (или только фича) и как это можно применить — вроде, все поняли
![]() Wound, если изначальная проблема не решена — предлагаю создать новую тему, где будет чётче описан кейс и желаемое поведение |
Сообщ.
#34
,
|
|
|
Цитата D_KEY @ И еще интересно, как ты думаешь, что означает quoted на английском? Так я ж не против. Пусть оно берет в кавычки - нафига она тогда экранирует. Мне изначально надо было просто заэкранировать строку. Все, без всяких кавычек. Цитата kopilov @ Wound, если изначальная проблема не решена — предлагаю создать новую тему, где будет чётче описан кейс и желаемое поведение Свою проблему я решил еще до создания темы. Это так, чисто было побубнеть. |
Сообщ.
#35
,
|
|
|
Цитата Wound @ Это так, чисто было побубнеть. Спасибо, хорошо ![]() |
Сообщ.
#36
,
|
|
|
Цитата Wound @ Цитата D_KEY @ И еще интересно, как ты думаешь, что означает quoted на английском? Так я ж не против. Пусть оно берет в кавычки - нафига она тогда экранирует. Потому что в противном случае получится некорректная строка внутри. Для того, чтобы корректно взять в кавычки, необходимо экранировать кавычки внутри строки. |
Сообщ.
#37
,
|
|
|
Цитата D_KEY @ Потому что в противном случае получится некорректная строка внутри. С чего вдруг внутри получится некорректная строка, если тебе просто нужно обернуть то что у тебя есть в кавычки? Она то как раз будет корректной, ты просто получишь закавыченный контент. Для кого оно станет некорректной то? Добавлено Цитата D_KEY @ Для того, чтобы корректно взять в кавычки, необходимо экранировать кавычки внутри строки. Да нет конечно. ![]() ![]() #include <iostream> #include <format> using namespace std; int main() { std::string str = "\"str\"ing\""; std::cout << std::format("\"{}\"", str); return 0; } Вот что тут в выводе некорректного по твоему? ![]() ![]() ""str"ing"" Добавлено Ладно, что то я подустал переливать из пустого в порожнее. Тем более щас тут дел много. Некогда мне спорить уже. |
Сообщ.
#38
,
|
|
|
Цитата Wound @ Она то как раз будет корректной, ты просто получишь закавыченный контент. Так не получишь. Ты легко можешь получить ""str"ing"", т.е. сначала пустая закавыченная строка, потом str без кавычек, потом закавыченный "ing" и потом одиначная кавычка. Соответственно, прежде чем просто поставить символ " в начало и в конец строки, нужно экранировать кавычки внутри. И quoted позволяет это сделать и поддерживает минимальную кастомизацию для указания правил экранирования. |
![]() |
Сообщ.
#39
,
|
|
Кто-нибудь может-таки поведать великую тайну: чего надо-то?
|
Сообщ.
#40
,
|
|
|
Qraizer, по всей видимости, надо
Цитата Wound @ чисто было побубнеть. |
Сообщ.
#41
,
|
|
|
Цитата D_KEY @ Соответственно, прежде чем просто поставить символ " в начало и в конец строки, нужно экранировать кавычки внутри. Для чего их нужно экранировать? Ты опять все в кучу сыпешь. Экранирование нужно тогда, когда тебе важно чтоб вот эта кавычка не воспринималась как спецсимвол. А чтоб она не воспринималась, как спецсимвол, а как обычный текст - ее собственно и нужно экранировать. Так вот, для того, чтоб что то взять в кавычки - экранировать ничего не нужно. Достаточно окавычить исходную строку. Поэтому quoted() и какой нибудь условный escape() - это две разные вещи. Одно просто берет и все спецсимволы в строке - экранирует. А другое просто берет и оборачивает строку кавычками. Добавлено Цитата Qraizer @ Кто-нибудь может-таки поведать великую тайну: чего надо-то? Да уже ничего не надо. |
Сообщ.
#42
,
|
|
|
Цитата Qraizer @ Кто-нибудь может-таки поведать великую тайну: чего надо-то? Просто Киле нужен был кавычкенг, а он использовал квотинг. Ну или наоборот ![]() ![]() |
Сообщ.
#43
,
|
|
|
Цитата Qraizer @ Кто-нибудь может-таки поведать великую тайну: чего надо-то? Чтобы либа подстроилась под то, что у кого-то уже написаны кавычки для обрамления и просто делала только экранирование без добавление " в начале и конце строки. Добавлено Цитата Wound @ Экранирование нужно тогда, когда тебе важно чтоб вот эта кавычка не воспринималась как спецсимвол. Мне нужно, чтобы кавычка внутри не воспринималась как кавычка. Добавлено Цитата Wound @ Так вот, для того, чтоб что то взять в кавычки - экранировать ничего не нужно. Достаточно окавычить исходную строку Нет. Не достаточно. Потому что "aaa"bbb"aa" закавычена некорректно, т.к. кавычки внутри остались и интерпретируются как кавычки. Добавлено Цитата Wound @ Поэтому quoted() и какой нибудь условный escape() - это две разные вещи. Одно просто берет и все спецсимволы в строке - экранирует. А другое просто берет и оборачивает строку кавычками. Условный escape() может быть полезен, да. Но описанный тобой quoted() является бесполезным. Добавлено Цитата Wound @ А другое просто берет и оборачивает строку кавычками. Зачем? Если он не будет экранировать кавычки внутри, то как ты предлагаешь его использовать? Только в связке с escape() и будет иметь смысл это делать. Так и сделано в std. То, что не помешал бы некий отдельный escape(), который бы не добавлял кавычки - согласен, можно было б. Но quoted вполне справляется с задачей. |
Сообщ.
#44
,
|
|
|
Цитата D_KEY @ Мне нужно, чтобы кавычка внутри не воспринималась как кавычка. Тогда очевидно тебе нужно экранирование, а не закавычивание. Цитата D_KEY @ Нет. Не достаточно. Потому что "aaa"bbb"aa" закавычена некорректно, т.к. кавычки внутри остались и интерпретируются как кавычки. Типа ты споришь ради спора? Если тебе надо экранирование - то экранируй строку. Причем тут закавычивание? Не, не хочу я с тобой троллем вести диалог, ты несешь чушь какую то. Я тебе про васю, ты мне в ответе про петю. Все, иди с кем то другим общайся. |
Сообщ.
#45
,
|
|
|
Цитата Wound @ Цитата D_KEY @ Мне нужно, чтобы кавычка внутри не воспринималась как кавычка. Тогда очевидно тебе нужно экранирование, а не закавычивание. Очевидно, что закавычивание, которое не умеет экранировать кавычки внутри, бесполезно. Добавлено Цитата Wound @ Типа ты споришь ради спора? Если тебе надо экранирование - то экранируй строку. Причем тут закавычивание? Не, не хочу я с тобой троллем вести диалог, ты несешь чушь какую то. Я тебе про васю, ты мне в ответе про петю. Все, иди с кем то другим общайся. Ты создаешь кликбейтную тему, ругаешься на стандартную библиотеку, не можешь толком объяснить, зачем ты потом сам ставишь ещё один кавычки, сам признаешься, что тему создал ради "побубнеть", а тролль я ![]() |