Рассматриваем ситуацию: js посылает, сервер принимает (php) и записывает в базу Mysql
JS encodeURIComponent
Сначала на JS функция encodeURIComponent кодирует любые символы, за исключением следующих:
латинские буквы abcABC
десятичные цифры 0123456789
спецсимволы - _ . ! ~ * ' ( )
в 3 байтовую кодировку , к примеру как картинке ниже:
Тут надо понимать, что более дополнительно делать ничего НЕ НАДО, потому-то любой символ нормально закодируется. То есть в таком формате можно спокойно передавать серверу.
Символ %
И это не правда, а как же сам символ процент %. Если он используется при кодировании как служебный символ. Что с ним делать?
Его надо заменять на % (это называется escape последовательность)
var proc = /[%]/g;
cont = cont.replace(proc,'%')
'%' - может показаться, что тут ошибка, но на самом деле именно так правильно. Дело в том, что функция replace в параметре замены сама зачем-то сначала заменяет escape последовательность на соответствующий символ (кто ее об этом просит...)
Надо сказать, что данные которые мы хотим послать на сервер, мы получаем на Js через jquery html() функцию для блока div, где расположено наше содержание. Блок div у нас contenteditable.
Это к тому, что html() уже сама заменяет некоторые спец символы такие как & например, а вот символ % не заменяет.
Все эти нюансы видны через console.log() в js.
Следующий этап после замены спец символов, это посылка данных на сервер.
На сервере принимаем и декодируем через функцию url_decode(), это на php.
Mysql
Далее декодированные данные надо например записать в базу данных Mysql и тут появляются такие нюансы:
Для записи в таблицу в MySql надо экранировать символы:
Одинарная кавычка '
Символ обратный слэш \
Возможно есть еще какие-то символы.Это делается только для этапа записи в Mysql.
Экранирование этих символов можно сделать на php через функцию mysqli_real_escape_string.
Таким образом в базе данных мы получим такие же данные как и на стороне браузера в блоке div.
Надо отметить, что то что вы видите на странице браузера какой-то символ типа & или % ещё не говорит, какие байты за ним стоят. Посмотреть можно просто исходный код страницы и все станет очевидно.
Данная страница как раз и демонстрирует механизм записи ее содержания в базу Mysql на сервере и ее последующее отображение вновь в браузере.
На этой странице можно спокойно писать все спец символы, все корректно будут отображаться: -&@#:;*"!?!, ( )/=%_'[]\|~`•÷©®™
Символ +
И тут замечено, что ещё символ плюс забыли заменить на escape последовательность. Дело в том, что по умолчанию он будет заменяться на пробел.
Вот и все, чем хотелось поделится.Успехов!