Проблемы с сохраненными JSON-закодированными POST в MySQL - PullRequest
2 голосов
/ 25 октября 2010

У меня есть ситуация, когда после нескольких лет использования у нас неожиданно появляются некоторые значения в кодировке JSON, которые приводят в соответствие наши сценарии Perl из-за обратной косой черты.

Проблемы с акцентированными символами, такими как í и é. Примером является Matí, закодированный как Mat \ ud873.

Неясно, что могло измениться в окружающей среде. PHP, Perl и MySQL участвуют. Сортировка таблицы - latin1_swedish_ci, и, возможно, это изменилось из-за того, что сотрудник облажался.

Звонит ли это кому-нибудь из колоколов?

1 Ответ

5 голосов
/ 26 октября 2010

Проблема здесь в интернационализации на стороне JavaScript, а не в сопоставлении вашей таблицы БД.Если у вас раньше не было таких проблем, скорее всего, ранее никто не вводил международные символы, или набор символов ваших HTML-страниц был ISO-8859-1 / cp1252 (что ограничивало бы данные формы POST на стороне клиента.) Новыйпользователи или измененные заголовки HTML могли бы вызвать эту проблему, но проблема действительно на стороне сценария Perl.

JSON определяет строки как наборы символов в двойных кавычках с escape-последовательностями Unicode когда необходимо более 7-битное кодирование.Первые 127 ISO-8859-1 символов могут быть представлены как есть, но любые расширенные ASCII / многобайтовые символы будут заканчиваться как значения \ uXXXX.Например, символ é (e-sharp), который является # 233 в ISO-8859-1, будет отображаться как \ u00E9 (так как é равно U + 00E9 в Unicode), а строка «резюме» будет храниться как «r\ u00E9sum \ u00E9 ".

Не зная, что пытается сделать ваш Perl-скрипт, все, что я могу сказать, это то, что он может испытывать трудности при попытке отменить ссылку на escape-последовательность.Perl имеет свой собственный набор escape-последовательностей, и \ u средняя строка фактически означает «сделать следующий символ заглавными», так что вы, вероятно, видите много «00E9» вещей из вашего сценария Perlвместо акцентированных символов, или вы можете получить ошибки разбора в зависимости от вашего скрипта.

Поскольку вы создаете / сохраняете JSON из данных POST в PHP, у вас есть несколько опций:

  1. Преобразование специальных символов в объекты HTML ( htmlentities () )
  2. Принудительное сокращение всех специальных символов из последовательностей UTF-8 (если это то, что входит в ваши данные POST) в ISO-8859-1 через utf8_decode () (при таком подходе вы можете потерять данные )
  3. Очистить результирующий JSON, заменив это совпадение с REGEX: / \\ u [a-zA-Z0-9] {4,4} / с "" (ничего) (при таком подходе вы можете потерять данные )
  4. Дважды экранировать результирующий JSON, изменив все "\ "символы в" \\ "перед передачей его в скрипт Perl ( остерегайтесь внедрения SQL! )
...