Страницы

Поиск по вопросам

Показаны сообщения с ярлыком символы. Показать все сообщения
Показаны сообщения с ярлыком символы. Показать все сообщения

пятница, 14 февраля 2020 г.

Как можно увеличить значение символа в JS

#javascript #символы


Можно ли как, допустим, в C++ применить какие-то операции с символом, чтобы он шёл
дальше по алфавиту?

Например:

char sym = 'a';
sym++; // sym = 'b'
sym++; // sym = 'c'

    


Ответы

Ответ 1



function nextSymbol(a) { return String.fromCharCode(a.charCodeAt(0) + 1); } console.log(nextSymbol('a')); console.log(nextSymbol('г')); console.log(nextSymbol('Ц')); var a = 'а'; for (var i = 1; i <= 33; i++) { console.log(i, a); a = nextSymbol(a); } console.log(i, a);

Ответ 2



Варианты с charCode будут работать, только если ожидаются символы, вмещающиеся в два байта. Для поддержки всего Юникода (включая эмодзи и т.д.), нужно немного изменить. Разницу можно увидеть, если запустить этот код в консоли браузера или любом другом инструменте, отображающем эмодзи. Правильный код должен позволить перейти от эмодзи коня к эмодзи барашка. 'use strict'; function nextSymbolLegacy(a) { return String.fromCharCode(a.charCodeAt(0) + 1); } function nextSymbolNew(a) { return String.fromCodePoint(a.codePointAt(0) + 1); } const horse = '\u{1F40E}'; const ram = '\u{1F40F}'; console.log(horse); console.log(ram); console.log(nextSymbolLegacy(horse)); console.log(nextSymbolNew(horse)); Функция с charCode будет выводить символ со знаком вопроса, обозначающий осиротевший символ из суррогатной пары.

воскресенье, 9 февраля 2020 г.

Экранирование специалных символов для аргументов SSH команды

#unix #shell #символы #экранирование


Задача:


Переменная, содержит в конце $$

$ a='SYS_$$'

$ echo $a

SYS_$$

Тут разворачивает $$ в конце строки как номер процесса, а надо отобразить строку
"SYS_$$", передаваемую как параметр.

$ echo "echo \$1" | ssh another_host "/bin/sh -s $a"

SYS_18992


    


Ответы

Ответ 1



Попробуйте так: $ a='SYS_$$' $ echo 'echo $1' | ssh another_host "/bin/sh -s '$a'" SYS_$$ При вызове ssh, внутри двойных кавычек одиночные кавычки тетряют своё специальное назначение и переменная $а будет замещена её значением, т.е. $SYS_$$. Далее, при вызове sh на удалённом хосте, одиночные кавычки вновь приобретают своё специальное назначение и препятствуют замещению $$ текущим pid.

Ответ 2



надо передать символы одинарных кавычек вокруг аргумента, с которым вызывается программа sh. для этого надо добавить перед кавычками символы \: $ v='a$$'; echo 'echo $1' | ssh хост sh -s \'$v\' a$$

среда, 5 февраля 2020 г.

Символьные константы в языке Си

#c #символы #ansi


Вопрос больше философского характера, чем технического. По определению константой
в языке Си назвается такая переменная, которую нельзя изменять по ходу выполнения программы
и такая переменная доступна только для чтения. Вопрос с объявлением числовых констант
отпадает сразу - и так ясно, что имеется в виду 

int const a = 5;


Такое объявление и описание не вызывает особых трудностей для понимания. Что же подразуемвается
под символьной константой? Языком лысого ёжика, это числовой код, которому соответствует
символьное отображение (ASCII-код). Но что здесь является константой; в чем выражается
неизменность? Что каждому символу соответствует данный код? Но как мы его изменим?
Ведь язык не допускает такую конструкцию:

'a' = 666;


Вопрос, на которого я требую ответа: "В чем выражается неизменность символьных констант?"
    


Ответы

Ответ 1



Термин константа в языке С имеет строгое определение. По определению, термин константа обозначает именно и только буквальные литеральные значения: 25, 'f', 0x13, 3.1415. Также термин константа в языке С распространяется на члены перечислений, результат _Alignof и sizeof (с некоторыми исключениями). Это все. Объекты, объявленные со спецификатором const, константами в языке С не являются. Ваше int const a = 5; это ни в коем случае не константа в языке С (!). Это просто, скажем так, "немодифицируемая переменная". Важность правильного понимания термина константа обуславливается тем, что ряд контекстов в языке С требует использования именно констант и константных выражений. Например, инициализатор для статического объекта должен быть именно константой. Ваше a в этой роли использовать не получится int const a = 5; static int x = a; // Ошибка - инициализатор не константен Символьными константами в С называются константы вида 'a' (также сюда можно причислить мультисимвольные константы вида 'abc'). Они не являются lvalue. Не существует никаких корректных конструкций языка С, которые могли бы их изменить. В этом и заключается их "неизменность". То есть вторая часть вашего вопроса действительно содержит правильный ответ. Невозможно "изменить" то, что не является lvalue.

Ответ 2



Символьная константа – это некоторый символ алфавита, заключенный в одиночные кавычки. Значением символьной константы является целое число, равное ASCII коду данного символа. Символьная константа имеет тип int или char и размерно состовляет 16 или 8 бит, соответственно.

суббота, 4 января 2020 г.

Замена символов в строке

#cpp #парсер #символы #замена


У меня есть строка: "''Start''".
После всех действий над ней, должно получиться: "Start". Т.е удаляются все символы
",  а затем все пары символов '' заменяются на ".
Удаляю из нее все символы ":
result.erase(std::remove(result.begin(), result.end(), '"' ), result.end());

Затем нужно заменить все пары символов '' на ":
replace(result.begin(), result.end(), "\'\'", "\"");

Выдает ошибку следующую ошибку: 

tools/data_parser.cpp: In function ‘int main(int, const char**)’:
tools/data_parser.cpp:21:52: error: no matching function for call to ‘replace(std::__cxx11::basic_string::iterator,
std::__cxx11::basic_string::iterator, const char [3], const char [2])’
  replace(result.begin(), result.end(), "\'\'", "\"");
                                                    ^
In file included from /usr/include/c++/5/algorithm:62:0,
                 from tools/data_parser.cpp:7:
/usr/include/c++/5/bits/stl_algo.h:4233:5: note: candidate: template void std::replace(_FIter, _FIter, const _Tp&, const _Tp&)
     replace(_ForwardIterator __first, _ForwardIterator __last,
     ^
/usr/include/c++/5/bits/stl_algo.h:4233:5: note:   template argument deduction/substitution
failed:
tools/data_parser.cpp:21:52: note:   deduced conflicting types for parameter ‘const
_Tp’ (‘char [3]’ and ‘char [2]’)
  replace(result.begin(), result.end(), "\'\'", "\"");


Я так понимаю, что std::replace заменяет только один символ на другой. Как заменить
пару символов? Компилирую так: g++-5 -std=c++11 cfg_parser.cpp -o cfg_parser
    


Ответы

Ответ 1



Если я вас правильно понял, то вы можете выполнить задачу следующим образом #include #include #include int main() { std::string s( "\"''Start''\"" ); std::cout << '[' << s << ']' << std::endl; s.erase( std::remove( s.begin(), s.end(), '"' ), s.end() ); for ( std::string::size_type n = 0; ( n = s.find( "''", n ) ) != std::string::npos; ++n ) { s.replace( n, 2, 1, '"' ); } std::cout << '[' << s << ']' << std::endl; } Программа имеем следующий вывод на консоль: ["''Start''"] ["Start"]

Ответ 2



Просто, быстро и (надеюсь) надежно #include #include char * replq (char *str) { int i, j; for (i = j = 0; str[i]; i++) if (str[i] != '"') { if (str[i] == '\'' && str[i + 1] == '\'') { str[j++] = '"'; i++; } else str[j++] = str[i]; } str[j] = 0; return str; } int main (int ac, char *av[]) { char str[1000]; while (fgets(str, 1000, stdin)) puts(replq(str)); return puts("End") == EOF; } По поводу Си -- конечно это Си (но g++ признает код своим, т.е. крестовым).

Ответ 3



std::replace действительно заменяет лишь символы. Вам нужно воспользоваться string::replace. string haystack = "''text''"; string needle = "''"; size_t pos; while ((pos = haystack.find(needle)) != haystack.npos) haystack.replace(pos, pos + needle.length(), "\""); Проверка: http://ideone.com/zxa0Rn Впрочем, это по сути не отличается от варианта @Vlad from Moscow

Ответ 4



/*********************************************************** * Method: fn_Replace * Description Замена одного символа в строке на один символ или строку * Returns: void * Parameter: wstring & ws - исходная строка * Parameter: const wchar_t wchF - один заменяемый символ * Parameter: LPCTSTR wchR - замена, символ или строка символов ************************************************************/ void fn_Replace(wstring& ws, const wchar_t wchF, LPCTSTR wchR) { size_t sz = ws.size(); for(size_t i = 0; i < sz; ++i) { if(ws[i] != wchF) continue; else ws.replace(i,1,wchR); } }

пятница, 13 декабря 2019 г.

Правильный способ хранения текста и HTML-кода в базе MySQL

#php #символы #html #mysql


Каким образом необходимо обрабатывать текст и html-код для записи в базу MySQL? Какая
схема?
Перерыл интернет, везде совет для записи в базу использовать mysql_real_escape_string(),
и больше вроде ничего не нужно.
Но как быть со спец-мисволами html? К примеру "⇔" при вставке в форму отображается
как символ, а не как html-код сивола. Соответственно при записи в базу, он превращается
в "?"
Как я понимаю необходимо обрабатывать текст вот так перед вставкой:
$inputText = htmlentities($inputText, ENT_NOQUOTES, 'UTF-8');
$inputText = mysql_real_escape_string($inputText);

Соответственно при выводе из базы на отображение необходимо обрабатывать текст вот так:
$inputTex = html_entity_decode($inputTex);

Такой алгоритм правильный или надо делать как-то по-другому?
Кодировка сайта utf8.    


Ответы

Ответ 1



Вопрос очень простой, но в то же время очень характерный. В нем отлично собраны наиболее популярные заблуждения начинающих пользователей РНР. Попробуем в них разобраться. Хранение Самое первое, что надо научиться - это не путать хранение данных и их использование в SQL запросах. Это совершенно разные вещи. По поводу хранения следует понимать, что храниться в БД могут абсолютно любые данные, и при этом храниться они должны как есть. То есть, для хранения их никак, вообще никак обрабатывать не нужно. Следовательно, отвечая на поставленные в посте (не совсем корректные, как мы видим), вопросы: Как хранить какие-либо данные в БД? Данные должны храниться как есть. Как обрабатывать данные для БД? Никак. Ни в коем случае никак обрабатывать нельзя. Как хранить HTML? Никаких особенных действий ни для HTML, ни для любых других данных производить не нужно. Все данные хранятся абсолютно одинаково. Использование данных в SQL запросах. А вот это уже совсем другой вопрос. Единственный, в ответ на который нам надо будет что-то делать. Но при этом сами данные мы всё равно трогать не будем. Да-да! Даже для помещения в SQL запрос мы никак данные обрабатывать не будем. Дело в том, что "совет для записи в базу использовать mysql_real_escape_string()" - это просто феерическая глупость, к сожалению, растиражированная в миллионах экземпляров. А единственно правильный способ добавления данных в SQL запрос - это делать это через плейсхолдеры. То есть, чтобы использовать любые данные в SQL запросе, надо сначала на их месте написать знаки вопроса: INSERT INTO users (name, lastname) VALUES (?,?) это, кстати, касается вообще всех запросов. SELECT мы пишем точно так же: SELECT * FROM users WHERE name=? после этого надо будет подготовить запрос, а потом выполнить его, передав переменные отдельно. Вот как это происходит на примере PDO: $stmt = $pdo->prepare("INSERT INTO users (name, lastname) VALUES (?,?)"); $stmt->execute(array($name, $lastame)); то есть, идея такая: если нам надо подставить в запрос какую-либо переменную, вместо неё надо поставить знак вопроса. А саму переменную передать после. Таким образом мы будем гарантированы от любых ошибок и неприятностей, поскольку РНР сам обработает за нас все переменные и сделает это правильно. Спец-символы HTML Я думаю, что внимательный читатель уже уловил идею: HTML вообще никакого отношения к БД не имеет. Ни малейшего. Это абсолютно разные вещи. То есть пользователю РНР никогда не должна приходить в голову идея использовать функцию, в которой встречается слово "HTML" для какой-либо работы с БД, а при работе с HTML - функцию, в которой встречается слово "mysql". Функции для работы с HTML следует применять для работы с HTML. То есть, если мы собираемся выводить HTML текст в HTML, то мы его должны выводить как есть. Но если мы собираемся выводить в HTML текст, который не является HTML, мы должны отформатировать его так, чтобы он нам случайно не попортил верстку. Обычно для этого используется функция htmlspecialchars() Кодировка Если какой-либо символ сохраняется в виде знака вопроса, то это не проблема HTML кодирования, а проблема кодировки, которая попросту не поддерживает данный символ. Чтобы БД могла сохранять символы типа ⇔, у нее должна быть кодировка utf8. А также РНР скрипт, устанавливая соединение с базой, должен выставлять кодировку этого соединения в utf8. При этом отображая пользователю форму, должен выдавать НТТР заголовк Content-type с кодировкой UTF-8. И тогда все символы запишутся в целости и сохранности.

понедельник, 8 апреля 2019 г.

Символьные константы в языке Си

Вопрос больше философского характера, чем технического. По определению константой в языке Си назвается такая переменная, которую нельзя изменять по ходу выполнения программы и такая переменная доступна только для чтения. Вопрос с объявлением числовых констант отпадает сразу - и так ясно, что имеется в виду
int const a = 5;
Такое объявление и описание не вызывает особых трудностей для понимания. Что же подразуемвается под символьной константой? Языком лысого ёжика, это числовой код, которому соответствует символьное отображение (ASCII-код). Но что здесь является константой; в чем выражается неизменность? Что каждому символу соответствует данный код? Но как мы его изменим? Ведь язык не допускает такую конструкцию:
'a' = 666;
Вопрос, на которого я требую ответа: "В чем выражается неизменность символьных констант?"


Ответ

Термин константа в языке С имеет строгое определение. По определению, термин константа обозначает именно и только буквальные литеральные значения: 25, 'f', 0x13, 3.1415. Также термин константа в языке С распространяется на члены перечислений, результат _Alignof и sizeof (с некоторыми исключениями). Это все.
Объекты, объявленные со спецификатором const, константами в языке С не являются. Ваше
int const a = 5;
это ни в коем случае не константа в языке С (!). Это просто, скажем так, "немодифицируемая переменная".
Важность правильного понимания термина константа обуславливается тем, что ряд контекстов в языке С требует использования именно констант и константных выражений. Например, инициализатор для статического объекта должен быть именно константой. Ваше a в этой роли использовать не получится
int const a = 5; static int x = a; // Ошибка - инициализатор не константен
Символьными константами в С называются константы вида 'a' (также сюда можно причислить мультисимвольные константы вида 'abc'). Они не являются lvalue. Не существует никаких корректных конструкций языка С, которые могли бы их изменить. В этом и заключается их "неизменность". То есть вторая часть вашего вопроса действительно содержит правильный ответ. Невозможно "изменить" то, что не является lvalue.

понедельник, 4 февраля 2019 г.

Замена символов в строке

У меня есть строка: "''Start''". После всех действий над ней, должно получиться: "Start". Т.е удаляются все символы ", а затем все пары символов '' заменяются на " Удаляю из нее все символы " result.erase(std::remove(result.begin(), result.end(), '"' ), result.end());
Затем нужно заменить все пары символов '' на " replace(result.begin(), result.end(), "\'\'", "\"");
Выдает ошибку следующую ошибку:
tools/data_parser.cpp: In function ‘int main(int, const char**)’: tools/data_parser.cpp:21:52: error: no matching function for call to ‘replace(std::__cxx11::basic_string::iterator, std::__cxx11::basic_string::iterator, const char [3], const char [2])’ replace(result.begin(), result.end(), "\'\'", "\""); ^ In file included from /usr/include/c++/5/algorithm:62:0, from tools/data_parser.cpp:7: /usr/include/c++/5/bits/stl_algo.h:4233:5: note: candidate: template void std::replace(_FIter, _FIter, const _Tp&, const _Tp&) replace(_ForwardIterator __first, _ForwardIterator __last, ^ /usr/include/c++/5/bits/stl_algo.h:4233:5: note: template argument deduction/substitution failed: tools/data_parser.cpp:21:52: note: deduced conflicting types for parameter ‘const _Tp’ (‘char [3]’ and ‘char [2]’) replace(result.begin(), result.end(), "\'\'", "\"");
Я так понимаю, что std::replace заменяет только один символ на другой. Как заменить пару символов? Компилирую так: g++-5 -std=c++11 cfg_parser.cpp -o cfg_parser


Ответ

Если я вас правильно понял, то вы можете выполнить задачу следующим образом
#include #include #include
int main() { std::string s( "\"''Start''\"" );
std::cout << '[' << s << ']' << std::endl;
s.erase( std::remove( s.begin(), s.end(), '"' ), s.end() );
for ( std::string::size_type n = 0; ( n = s.find( "''", n ) ) != std::string::npos; ++n ) { s.replace( n, 2, 1, '"' ); }
std::cout << '[' << s << ']' << std::endl; }
Программа имеем следующий вывод на консоль:
["''Start''"] ["Start"]

среда, 9 января 2019 г.

Экранирование специалных символов для аргументов SSH команды

Задача:
Переменная, содержит в конце $$
$ a='SYS_$$'
$ echo $a
SYS_$$ Тут разворачивает $$ в конце строки как номер процесса, а надо отобразить строку "SYS_$$", передаваемую как параметр.
$ echo "echo \$1" | ssh another_host "/bin/sh -s $a"
SYS_18992


Ответ

Попробуйте так:
$ a='SYS_$$' $ echo 'echo $1' | ssh another_host "/bin/sh -s '$a'"
SYS_$$
При вызове ssh, внутри двойных кавычек одиночные кавычки тетряют своё специальное назначение и переменная $а будет замещена её значением, т.е. $SYS_$$ Далее, при вызове sh на удалённом хосте, одиночные кавычки вновь приобретают своё специальное назначение и препятствуют замещению $$ текущим pid.

пятница, 14 декабря 2018 г.

Правильный способ хранения текста и HTML-кода в базе MySQL

Каким образом необходимо обрабатывать текст и html-код для записи в базу MySQL? Какая схема? Перерыл интернет, везде совет для записи в базу использовать mysql_real_escape_string(), и больше вроде ничего не нужно. Но как быть со спец-мисволами html? К примеру "⇔" при вставке в форму отображается как символ, а не как html-код сивола. Соответственно при записи в базу, он превращается в "?" Как я понимаю необходимо обрабатывать текст вот так перед вставкой: $inputText = htmlentities($inputText, ENT_NOQUOTES, 'UTF-8'); $inputText = mysql_real_escape_string($inputText); Соответственно при выводе из базы на отображение необходимо обрабатывать текст вот так: $inputTex = html_entity_decode($inputTex); Такой алгоритм правильный или надо делать как-то по-другому? Кодировка сайта utf8.


Ответ

Вопрос очень простой, но в то же время очень характерный.
В нем отлично собраны наиболее популярные заблуждения начинающих пользователей РНР. Попробуем в них разобраться.
Хранение
Самое первое, что надо научиться - это не путать хранение данных и их использование в SQL запросах. Это совершенно разные вещи. По поводу хранения следует понимать, что храниться в БД могут абсолютно любые данные, и при этом храниться они должны как есть. То есть, для хранения их никак, вообще никак обрабатывать не нужно.
Следовательно, отвечая на поставленные в посте (не совсем корректные, как мы видим), вопросы:
Как хранить какие-либо данные в БД? Данные должны храниться как есть. Как обрабатывать данные для БД? Никак. Ни в коем случае никак обрабатывать нельзя. Как хранить HTML? Никаких особенных действий ни для HTML, ни для любых других данных производить не нужно. Все данные хранятся абсолютно одинаково.
Использование данных в SQL запросах.
А вот это уже совсем другой вопрос. Единственный, в ответ на который нам надо будет что-то делать. Но при этом сами данные мы всё равно трогать не будем. Да-да! Даже для помещения в SQL запрос мы никак данные обрабатывать не будем. Дело в том, что "совет для записи в базу использовать mysql_real_escape_string()" - это просто феерическая глупость, к сожалению, растиражированная в миллионах экземпляров.
А единственно правильный способ добавления данных в SQL запрос - это делать это через плейсхолдеры.
То есть, чтобы использовать любые данные в SQL запросе, надо сначала на их месте написать знаки вопроса:
INSERT INTO users (name, lastname) VALUES (?,?)
это, кстати, касается вообще всех запросов. SELECT мы пишем точно так же:
SELECT * FROM users WHERE name=?
после этого надо будет подготовить запрос, а потом выполнить его, передав переменные отдельно. Вот как это происходит на примере PDO:
$stmt = $pdo->prepare("INSERT INTO users (name, lastname) VALUES (?,?)"); $stmt->execute(array($name, $lastame));
то есть, идея такая: если нам надо подставить в запрос какую-либо переменную, вместо неё надо поставить знак вопроса. А саму переменную передать после.
Таким образом мы будем гарантированы от любых ошибок и неприятностей, поскольку РНР сам обработает за нас все переменные и сделает это правильно
Спец-символы HTML
Я думаю, что внимательный читатель уже уловил идею: HTML вообще никакого отношения к БД не имеет. Ни малейшего. Это абсолютно разные вещи. То есть пользователю РНР никогда не должна приходить в голову идея использовать функцию, в которой встречается слово "HTML" для какой-либо работы с БД, а при работе с HTML - функцию, в которой встречается слово "mysql".
Функции для работы с HTML следует применять для работы с HTML.
То есть, если мы собираемся выводить HTML текст в HTML, то мы его должны выводить как есть.
Но если мы собираемся выводить в HTML текст, который не является HTML, мы должны отформатировать его так, чтобы он нам случайно не попортил верстку. Обычно для этого используется функция htmlspecialchars()
Кодировка
Если какой-либо символ сохраняется в виде знака вопроса, то это не проблема HTML кодирования, а проблема кодировки, которая попросту не поддерживает данный символ. Чтобы БД могла сохранять символы типа ⇔, у нее должна быть кодировка utf8. А также РНР скрипт, устанавливая соединение с базой, должен выставлять кодировку этого соединения в utf8. При этом отображая пользователю форму, должен выдавать НТТР заголовк Content-type с кодировкой UTF-8.
И тогда все символы запишутся в целости и сохранности.

вторник, 9 октября 2018 г.

Оператор => в JavaScript

Изучаю JavaScript, в Википедии встретил пример описания многомерных массивов
код такой:
// Создание двумерного массива чисел: var array = [ [11, 12, 13, 14, 15, 16], // Первая строка-массив [21, 22, 23, 24, 25, 26], // Вторая [31, 32, 33, 34, 35, 36] // Третья ];
// Вывод массива на консоль: array.forEach((subArray) => { // Для каждого под-массива, subArray.forEach((item) => { // для каждого его элемента, console.log(item); // — вывести этот элемент на консоль. }); });
Вопрос: что означает оператор => (оператор ли это вообще)? Читаю Д. Флэнагана "JavaScript. Подробное руководство", в тексте данный оператор не встречается, в сети тоже не смог найти описание.
UPD: Спасибо за ответы!


Ответ

Данный оператор называется стрелочной функцией. Появился с ECMA2015. https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions
Стрелочные функции помогают существенно сократить код, ведь
var a = a.map( s => s.length );
выглядит куда лучше, чем
var a = a.map(function(s){ return s.length } );
Стрелочными функциями решают еще одну наболевшую проблему JavaScript: необходимость передавать this в контекст исполнения функции. Каждая функция имеет свой контекст, поэтому приходится либо присваивать this переменной:
var that = this; var filter1 = function(){ // this != that return that.visible; };
Либо использовать bind для привязки контекста:
var filter1 = (function(){ return this.visible; }).bind( this );
Со стрелочной функцией все значительно проще и компактнее, потому что она не создает свой контекст this:
var filter1 = () => this.visible;